SignalR响应覆盖标头

7
我建立了一个简单的SignalR hub,它位于一个WebAPI服务内部。我已在WebAPI和SignalR上包含所有必需的CORS属性。我的WebAPI端点都按预期工作,但SignalR没有。

我尝试了我能想到的方法,并查找了在线资源,但什么都没用。我已尝试这个答案另一个答案,但都没有解决方案。

我的SignalR扩展方法如下所示:

public static IAppBuilder UseSignalrNotificationService(this IAppBuilder app)
    {
        var config = new HubConfiguration();
        config.Resolver = new HubDependencyResolver();
        config.EnableDetailedErrors = true;
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR(config);

        return app;
    }

我甚至尝试使用Web.config在所有请求上添加响应头,但我始终收到相同的错误:

XMLHttpRequest无法加载https://MyApplicationServer/notifications/signalr/negotiate?clientProtocol=1.5&access_token=&connectionData=。当凭据标志为true时,“Access-Control-Allow-Origin”标头中不能使用通配符“*”。因此,“MyOriginService”不允许访问。 XMLHttpRequest的凭据模式由withCredentials属性控制。

注意:请勿删除HTML标签。
2个回答

13

经过更多的研究和调试服务器端问题后,我遇到了这个答案并发现错误在于请求的客户端部分。根据这个 GitHub 问题,请求的“withCredentials”参数总是设置为“true”。解决方案是如下在客户端调用start方法:

$.connection.hub.start({ withCredentials: false }).done(function () {  //... }

0
你是否在某个全局拦截器中更改了请求?由于某种原因,XMLHttpRequest始终以withCredentials:true开始,而当Access-Control-Allow-Origin设置为*时,这是被禁止的。
将'Access-Control-Allow-Origin'设置为'http://MyApplicationServer'怎么样?这比*更安全,并且可以从根本上解决您的问题。

我尝试更改SignalR的CORS策略以指定源,但没有结果,请求及其头部发生了一些奇怪的事情。 - evilpilaf
@evilpilaf,你搞清楚如何指定来源了吗?我无法让它工作。 - David Klempfner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接