【问题标题】:How to use cross-domain connections (CORS - Access Control Allow Origin) with SignalR如何使用 SignalR 使用跨域连接(CORS - 访问控制允许来源)
【发布时间】:2012-04-16 14:12:11
【问题描述】:

使用持久连接和 ASP.NET JavaScript 客户端,我尝试连接到与提供页面的子域不同的子域。

来自网络服务器 sub1.mydomain.com 的 ASP.Net 页面想要连接到位于 sub2.mydomain.com 的 SignalR。在同一个子域中连接时,相同的代码可以正常工作。

我发现另一个帖子启用了跨域连接:

jQuery.support.cors = true;

但这对我不起作用。

如何使用持久连接和 JavaScript 客户端连接到第二个子域中的 SignalR?

【问题讨论】:

    标签: asp.net asp.net-mvc signalr cors


    【解决方案1】:

    您需要执行以下操作之一才能使其工作:

    • 设置$.connection.hub.url = 'http://subdomain.domain.com/signalr';,指向您的子域。
    • 在服务器上启用跨域:

      RouteTable.Routes.MapHubs(new HubConfiguration()
      {
        EnableCrossDomain = true
      });
      

    【讨论】:

    • 我已经尝试了第一个和第三个项目符号,但我使用的是持久连接,因此第二个项目符号不适用。仍然无法连接。
    • @codezoo 对于持久连接,您还可以指定一个 url,例如。 var con = $.connection('echo'); con.url = http://my.domain.com/echo. 在此处指定完整的 URL:$.connection('http://my.domain.com/echo') 应该也可以,虽然我没有检查。
    • 谢谢 Piotr,我目前正在使用这种方法:$.connection('my.domain.com/echo')
    • 我得到这个输出:...\Global.asax.cs(17,64,17,81): error CS0117: 'Microsoft.AspNet.SignalR.HubConfiguration' 不包含定义'EnableCrossDomain' ...\Global.asax.cs(17,13,17,91): 错误 CS0619: 'System.Web.Routing.SignalRRouteExtensions.MapHubs(System.Web.Routing.RouteCollection, Microsoft.AspNet.SignalR. HubConfiguration)' 已过时:'在 Owin Startup 类中使用 IAppBuilder.MapSignalR。有关详细信息,请参阅go.microsoft.com/fwlink/?LinkId=320578。'
    • 但我仍然想在可用时使用 WebSockets,而不是 JSONP。
    【解决方案2】:

    在当前版本的 SignalR 中,使用现在单独的 CORS 包,用于此的 API 已更改为:

    public void Configuration(IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
            };
            map.RunSignalR(hubConfiguration);
        });
    }
    

    ASP.NET SignalR Hubs API Guide - JavaScript Client

    【讨论】:

    • 如果您还没有添加using Microsoft.Owin.Cors;(以及安装相应的 NuGet 包),您还需要添加。
    • 使用 AllowAll 安全吗?这是否意味着任何网站都可以设置为接收来自 SignalR 的通知?
    【解决方案3】:

    如果从 0.5.1 切换到 0.5.2,您可能有以下情况:

    $.connection.hub.start({ transport: 'longPolling', xdomain: true }, function () {...
    

    可以改成:

    $.connection.hub.start({ jsonp: true }, function () {...
    

    【讨论】:

      【解决方案4】:

      在 Signalr2 中,您可以使用 Microsoft.Owin.Cors 的预发布版本,目前为 3.0.0-rc1,撰写本文时:Microsoft.Owin.Cors

      更多信息可以在这里找到:

      【讨论】:

        【解决方案5】:
        var connection = $.connection('http://somecrossdomainurl/echo')
        connection.start({ transport: 'longPolling', xdomain: true });
        

        https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client

        【讨论】:

          【解决方案6】:

          真正解决我的问题的是:

          1 - 将此添加到 global.asax:

          RouteTable.Routes.MapHubs(new HubConfiguration() { 
              EnableCrossDomain = true 
          });
          

          2- 设置我的 web 项目的 web.config 以启用跨域:

          <system.webServer>
              <httpProtocol>
                  <customHeaders>
                      <add name="Access-Control-Allow-Origin" value="*" />
                      <add name="Access-Control-Allow-Headers" value="Content-Type" />
                  </customHeaders>
              </httpProtocol>
          </system.webServer>
          

          3- 然后我更改了我的 html 上的实现,将 $.connection() 更改为如下:

          var connection = $.hubConnection('http://localhost.my:8081/signalr');
          var chatHubProxy = connection.createHubProxy('chatHub');
          

          我正在使用的版本:

          • signalR-1.1.0

          • jquery.signalR-1.1.3.js

          • dot.net 4.0

          【讨论】:

          • 我正在使用 4 个子域,我应该在每个子域上托管我的集线器类,还是必须在所有子域上托管我的完整网站,包括我拥有的网页?
          • RouteTable.Routes.MapHubs(config);已弃用;现在默认启用 CORS,每个 weblogs.asp.net/davidfowler/signalr-0-5-1-released
          猜你喜欢
          • 2014-08-06
          • 1970-01-01
          • 2019-02-09
          • 2016-06-02
          • 2021-09-07
          • 2017-09-15
          • 2016-06-27
          • 2016-12-10
          • 1970-01-01
          相关资源
          最近更新 更多