2012-04-02 40 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

相關問題