2012-04-02 25 views
22

使用持久连接和ASP.NET JavaScript客户端,我试图连接到与页面不同的子域从服务。如何通过SignalR使用跨域连接(CORS - 访问控制允许来源)

ASP.Net从网络服务器sub1.mydomain.com的页面想要连接到SignalR在sub2.mydomain.com。在相同的子域内连接时,相同的代码工作正常。

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

jQuery.support.cors = true; 

但这并没有为我工作。

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

回答

34

你需要做以下操作之一,使其工作:

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

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

我试过第一个和第三个项目符号,但我使用的是持续连接,所以第二个项目符号不适用。仍然无法连接。 – codezoo 2012-04-03 23:42:22

+0

@codezoo对于持久连接,您还可以指定一个url,例如。 'var con = $ .connection('echo'); con.url = http:// my.domain.com/echo.'在这里指定完整的URL:'。.connection('http://my.domain.com/echo')'也应该工作,虽然我避难没有检查。 – 2012-04-04 05:29:47

+0

感谢Piotr,我目前使用这个方法:$ .connection('http://my.domain.com/echo') – codezoo 2012-04-04 10:58:44

7

如果从0.5.1到0.5.2的切换,你可能有以下几点:

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

可以更改为:

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

真正解决了我的问题是:

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的实施,改变了$■连接()来如下:

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

版本我使用的是:

  • signalR-1.1 0.0

  • jquery.signalR-1.1.3.js

  • dot.net 4。0

+0

我正在使用4个子域名,我是否应该在每个子域名上托管我的集线器类,还是应该在所有子域名上托管我的完整网站,包括我拥有的网页? – 2014-09-11 06:04:18

+1

RouteTable.Routes.MapHubs(config);已弃用; CORS现在默认启用每个http://weblogs.asp.net/davidfowler/signalr-0-5-1-released – 2015-03-31 03:03:53

6

在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

+0

感谢您指出这一点:) – 2016-07-16 13:25:33

+0

你还需要添加'使用Microsoft.Owin。 Cors;'(以及安装相应的NuGet包),如果你还没有。 – 2016-11-05 00:46:23

相关问题