7

我最近将一个项目从 SignalR 2.0.0-beta1 升级到 2.0.0-rc1。我知道在 RC1 中,对跨域请求的支持配置发生了变化。我已经更新了我的项目以使用新语法但是我现在在尝试与我的集线器通信时遇到以下错误:

XMLHttpRequest 无法加载 =1377623738064">http://localhost:8080/negotiate?connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&clientProtocol=1.3&=1377623738064。访问http://localhost:7176不允许来源-控制允许来源。

客户端站点正在运行,http://localhost:7176并且集线器正在通过控制台应用程序在http://localhost:8080. 我在这里错过了什么吗?在我升级到 RC1 之前,跨域请求正在工作。

控制台应用程序入口点

static void Main(string[] args)
{
    var chatServer = new ChatServer();
    string endpoint = "http://localhost:8080";

    chatServer.Start(endpoint);

    Console.WriteLine("Chat server listening at {0}...", endpoint);
    Console.ReadLine();
}

聊天服务器类

public class ChatServer
{
    public IDisposable Start(string url)
    {
        return WebApp.Start<Startup>(url);
    }
}

启动配置

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            map.RunSignalR(new HubConfiguration { EnableJSONP = true });
        });
    }
}
4

4 回答 4

8

您的客户端配置有问题。

XMLHttpRequest cannot load =1377623738064">http://localhost:8080/negotiate?connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&clientProtocol=1.3&=1377623738064. Origin http://localhost:7176 is not allowed by Access-Control-Allow-Origin.

协商请求应提出http://localhost:8080/signalr/negotiate?...http://localhost:8080/negotiate?...。要解决此问题,您可以在调用 $.connection.hub.start 之前尝试以下操作:

$.connection.hub.url = http://localhost:8080/signalr;

于 2013-08-27T18:35:43.997 回答
8

不确定这个问题是否已得到充分回答,但我对 Microsoft 提供的示例进行了以下更改:

public void Configuration(IAppBuilder app)
        {
            var config = new HubConfiguration();
            config.EnableJSONP = true;
            app.MapSignalR(config);
        }

我在 JS 示例中添加了以下内容:

$.connection.hub.start({ jsonp: true }).done(function () {
    $('#sendmessage').click(function () {
        // Call the Send method on the hub.
        chat.server.send($('#displayname').val(), $('#message').val());
        // Clear text box and reset focus for next comment.
        $('#message').val('').focus();
    });
});

现在启用了跨域脚本。希望这对其他人有帮助,我真的很困惑一段时间。

于 2013-09-09T08:54:04.507 回答
5

对于 Microsoft.Owin 2.x 及更高版本:

Microsoft.Owin.Cors在包管理器控制台中通过此命令通过 NuGet添加包:

PM> Install-Package Microsoft.Owin.Cors

然后using这个包在Startup类文件中:

using Microsoft.Owin;
using Microsoft.Owin.Cors;

然后像这样更改您的源代码:

// app.MapHubs(new HubConfiguration { EnableCrossDomain = true });
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
于 2015-09-30T11:04:21.977 回答
2

我认为处理跨域的最佳方法记录在这里 CrossDomain Signal R

于 2013-11-05T16:49:11.353 回答