Azure Mobile Services Web Api上的SignalR CORS

我有一个运行Web Api和c#的Azure移动服务,并按照在Azure Mobile Serivce .NET后端启用CORS中的建议启用了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’访问。

我已经检查了响应头并且可以确认没有发送回任何内容。

任何人都可以建议吗?

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

    公共课启动
     {
         public void Configuration(IAppBuilder app)
         {
             app.Map(“/ signalr”,map =>
                 {
                     //设置CORS中间件在SignalR之前运行。
                     //默认情况下,这将允许所有来源。 您可以 
                     //通过配置起源和/或http动词集
                     //使用不同的策略提供cors选项。
                     map.UseCors(CorsOptions.AllowAll);
                     var hubConfiguration = new HubConfiguration
                     {
                         //您可以通过取消注释下面的行来启用JSONP。
                         // JSONP请求是不安全的,但是一些旧的浏览器(以及一些
                         // IE的版本)需要JSONP才能跨域工作
                         // EnableJSONP = true
                         EnableJavaScriptProxies = false
                     };
                     //运行SignalR管道。 我们没有使用MapSignalR
                     //因为这个分支已经在“/ signalr”路径下运行了。
                     map.RunSignalR(hubConfiguration);
                 });
         }
     }

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

我找到了一种为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(); }); 

希望这可以帮助