我有一个运行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'访问。
我检查了响应标头,可以确认没有发回任何内容。
有人可以提供建议吗?
答案 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>();
});
希望这有帮助