请求 Hub 方法时 SignalR CORS 错误

Jus*_*ead 6 signalr

我只是想让 SignalR 设置运行 owin 托管,我想通过 JavaScript 客户端连接。应该很容易吧?我能够快速设置并运行 SignalR 服务器,并将客户端连接到服务器。但是,当在客户端调用 done 回调时,我尝试调用集线器 Send 方法,并且在控制台中收到以下错误:

XMLHttpRequest 无法加载http://localhost:8199/signalr/signalr/send?transport=serverSentEvents& clien …AxBg6iaFwlK50s2DnurE&connectionData=%5B%7B%22name%22%3A%22testhub%22%7D%5D。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost '。响应的 HTTP 状态代码为 500。

这是我的服务器端代码:

    public static IAppBuilder UseService(this IAppBuilder app)
    {
        log4net.Config.XmlConfigurator.Configure();
        app.UseService(NinjectConfig.CreateKernel);
        app.UseLogging();
        app.UseSignalr();
        return app;
    }
Run Code Online (Sandbox Code Playgroud)
    internal static IAppBuilder UseSignalr(this IAppBuilder app)
    {
        app.Map("/signalr", map =>
            {
               map.UseCors(CorsOptions.AllowAll);

                var hubConfig = new HubConfiguration {EnableDetailedErrors = true};
                map.RunSignalR(hubConfig);
            }
        );
        return app;
    }
Run Code Online (Sandbox Code Playgroud)

这是客户端:

    var connection = $.hubConnection('http://localhost:8199/signalr');
    var testHub = connection.createHubProxy('testHub');

    testHub.on('addMessage', function(name){
        console.log(name);
    });

    connection.start().done(function () {
            testHub.invoke('send', 'testName');
        }).fail(function (e) {
            console.log('Failed to connect');
        });
        connection.error(function(error){
        console.log(error);
    });
Run Code Online (Sandbox Code Playgroud)

为什么 CORS 请求适用于开始调用,而不适用于后续的集线器方法调用?

更新:在网络选项卡中,我可以看到有一个调用:http://localhost8199/signalr/negotiate - 此调用有效,并且 CORS 标头按预期响应响应

然后调用:http://localhost:8199/signalr/connect并且该调用也具有正确的 CORS 标头并且可以正常工作。

然后调用:http://localhost:8199/signalr/start同样的好事在这里发生。

最后调用:http://localhost:8199/signalr/send,这是失败的调用,每个失败消息的 CORS 标头为零。

更新:

我也试过像这样设置我的客户端:

    $.connection.hub.url = 'http://localhost:8199/signalr';
        var proxy = $.connection.testHub;
        proxy.client.addMessage = function(name){
            console.log(name);
    };

    $.connection.hub.start()
    .done(function () {
        console.log($.connection.hub.id);
        proxy.server.sendMessage()
            .done(function(val){
                console.log(val);
            });
     })
    .fail(function (e) {
        console.log('Failed to connect');
    });
Run Code Online (Sandbox Code Playgroud)

我对这项工作几乎没有希望,因为我觉得问题出在服务器端。但只是想更新我在这里尝试过的内容。

DDa*_*Dan 1

看看这个:http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#crossdomain

请参阅注释,他们指出,根据您使用的浏览器,您可能需要修复不同的问题。

SignalR 1.0.1 使用 Chrome 的跨域请求 (CORS)

SignalR IE9 跨域请求不起作用

在启动方法中尝试启用JSONP:

    internal static IAppBuilder UseSignalr(this IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
           map.UseCors(CorsOptions.AllowAll);

            var hubConfig = new HubConfiguration {
               EnableDetailedErrors = true,
               EnableJSONP = true
            };
            map.RunSignalR(hubConfig);
        };
        return app;
    }
Run Code Online (Sandbox Code Playgroud)