Azure移动服务Web Api上的SignalR CORS

时间:2014-06-04 09:52:28

标签: c# asp.net azure signalr azure-mobile-services

我有一个运行Web Api和c#的Azure移动服务,并按Enable CORS on Azure Mobile Serivce .NET Backend中的建议启用了CORS 但是我现在已经将SignalR添加到混音中了。

SignalR工作正常,但我无法找到如何启用CORS。

目前在我的测试应用配置中,我有以下内容:

//enable CORS for WebAPI
var cors = new EnableCorsAttribute("*", "*", "*");
httpconfig.EnableCors(cors);
//rather than use the static method new up SignalRExtensionConfig and pass the current config, hopefully allowing CORS...
var signalRConfig = new SignalRExtensionConfig();
signalRConfig.Initialize(httpconfig, ioc);

但CORS不适用于SignalR集线器,它仅适用于WebAPI :(我感到沮丧:

  

请求时没有'Access-Control-Allow-Origin'标头   资源。因此,不允许原点'null'访问。

我检查了响应标头,可以确认没有发回任何内容。

有人可以提供建议吗?

2 个答案:

答案 0 :(得分:1)

我正在使用下面的代码在我的WebAPI项目中将CORS添加到SignalR。但它并没有在移动服务中运行。不确定这是否有帮助。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/signalr", map =>
                {
                    // Setup the CORS middleware to run before SignalR.
                    // By default this will allow all origins. You can 
                    // configure the set of origins and/or http verbs by
                    // providing a cors options with a different policy.
                    map.UseCors(CorsOptions.AllowAll);
                    var hubConfiguration = new HubConfiguration
                    {
                        // You can enable JSONP by uncommenting line below.
                        // JSONP requests are insecure but some older browsers (and some
                        // versions of IE) require JSONP to work cross domain
                        // EnableJSONP = true
                        EnableJavaScriptProxies = false
                    };
                    // Run the SignalR pipeline. We're not using MapSignalR
                    // since this branch already runs under the "/signalr" path.
                    map.RunSignalR(hubConfiguration);
                });
        }
    }

作为答案粘贴,因为评论中没有多行代码。如果没有帮助,请忽略。

答案 1 :(得分:1)

我找到了一种为SignalR启用CORS的方法,但它似乎并不是“正确”的方式。但是,在我收到移动服务朋友的回复之前,这足以让我们继续发展。

Azure移动服务SignalR NuGet包中包含OwinAppBuilderExtension类。在启动期间使用此类来扩展信号器的Owin设置。然后我将其子类化并覆盖了ConfigureSignalR方法。

在此方法中,您可以访问IAppBuilder。在这里,我只需添加appBuilder.UseCors(CorsOptions.AllowAll);在base.ConfigureSignalR(appBuilder)之前;

现在这远非理想,因为我已经为所有内容启用了CORS并且说允许所有内容。但是对于开发测试,这是可以的,我将在以后提供自定义的CORS策略。

最后一步是设置我们的服务使用的新子类(CORSSignalROwinAppBuilderExtension)。

在您的HttpConfig设置中

 var configBuilder = new ConfigBuilder(options, (httpconfig, ioc) =>
 {
       ioc.RegisterInstance(new CORSSignalROwinAppBuilderExtension(httpconfig)).As<IOwinAppBuilderExtension>();
 });

希望这有帮助