C# 让CORS使用Web API和信号器
很难让Signal和CORS使用OWIN身份验证使用ASP.NET Web API v2 似乎我可以选择CORS与Signal或Web API一起工作,但不能同时使用两者。我正在通过代码配置CORS,因为试图通过web.config添加标题对我无效。下面是Startup.cs中的配置方法C# 让CORS使用Web API和信号器,c#,cors,signalr,owin,C#,Cors,Signalr,Owin,很难让Signal和CORS使用OWIN身份验证使用ASP.NET Web API v2 似乎我可以选择CORS与Signal或Web API一起工作,但不能同时使用两者。我正在通过代码配置CORS,因为试图通过web.config添加标题对我无效。下面是Startup.cs中的配置方法 public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); H
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
HttpConfiguration httpConfig = new HttpConfiguration();
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
ConfigureWebApi(httpConfig);
app.UseWebApi(httpConfig);
}
通过上述配置Web Api可以工作。我能够从客户端验证和调用API方法。但是,当客户机试图访问signar脚本时,我得到了一个错误。请注意,请求的资源上不存在CORS错误的“Access Control Allow Origin”头。起源'http://localhost:8080因此,不允许访问。
在第二条错误消息中
http://localhost:49834/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22loginhub%22%7D%5D&_=1461093918311 Failed to load resource: the server responded with a status of 404 (Not Found)
XMLHttpRequest cannot load http://localhost:49834/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&_=1461093918311. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 404.
这令人困惑为什么CORS配置不包括位于http://localhost:8080/signalr/
?
所以,在搜索某某并在谷歌上搜索了一段时间后,我发现了一个专门针对信号员的网站。建议在配置
方法中添加以下答案。在那个信号员工作之后
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
// ****** Start added code ******
//Branch the pipeline here for requests that start with "/signalr"
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;
};
// Run the SignalR pipeline. We're not using MapSignalR
// since this branch already runs under the "/signalr"
// path.
map.RunSignalR(hubConfiguration);
});
// ****** End added code *******
HttpConfiguration httpConfig = new HttpConfiguration();
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
ConfigureWebApi(httpConfig);
app.UseWebApi(httpConfig);
}
为什么需要将第二部分添加到配置中?以便信号器工作?不应该有
app.UseCors(CorsOptions.AllowAll)代码>有效?它实际上应该有效。第二种配置仅允许信号机的crosdomain,不允许所有交通。您正在尝试的浏览器可能是jsonp?在客户端使用Chrome时出现的问题。我已经注释掉了EnableJSONP
。据我所知,JSONP不推荐使用CORS。在我的案例中,配置不当的nginx ssl导致一些请求(如/signal)没有被服务器正确处理,响应没有CORS头,我仍然不知道这是否可能,但当我更改nginx配置时,它突然开始通过中间件,并返回cors ok头