【问题标题】:Cross domain requests not working in SignalR 2.0.0-rc1跨域请求在 SignalR 2.0.0-rc1 中不起作用
【发布时间】:2013-08-30 13:54:18
【问题描述】:

我最近将一个项目从 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 });
        });
    }
}

【问题讨论】:

    标签: c# signalr cors


    【解决方案1】:

    您的客户端配置有问题。

    XMLHttpRequest cannot load =1377623738064"&gt;http://localhost:8080/negotiate?connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&amp;clientProtocol=1.3&amp;=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;

    【讨论】:

    • 我知道这很愚蠢。我非常专注于我已经改变了跨域配置方法的事实,我没有意识到我无意中也改变了其他东西。谢谢。
    • 那么当服务器端涉及多个环境时,在 signalR 中处理跨域的最佳方法是什么?开发、开发和生产?我的意思是除了在每个生成的集线器文件中手动更改集线器连接之外还有什么办法吗?
    【解决方案2】:

    不确定这个问题是否得到充分回答,但我对 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();
        });
    });
    

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

    【讨论】:

    • 四处寻找答案,幸运地找到了你的答案。谢谢!
    • { jsonp: true } 对此点赞。是否强制使用json?或者它只是允许它被使用?
    • @Tauseef - 添加 JSONP 标志确实强制使用 JSON 作为消息传输,因为 JSONP 是跨不同域传递 JSON 数据的一种方式,请参阅:[link]stackoverflow.com/questions/2067472/what-is-jsonp-all-about[/…跨度>
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      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();
      

      【讨论】:

      • 在 SiganlR 2.2 中:app.UseCors() 不再存在。
      猜你喜欢
      • 2023-03-17
      • 2019-08-05
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2013-02-09
      • 2014-02-09
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多