C# 让CORS使用Web API和信号器

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

很难让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);
        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头