2013-03-12 69 views
13

注意:別人最初問這個問題,但刪除它之前,我可以發佈我的答案。由於這個問題涵蓋了許多開發人員在嘗試使SignalR跨域工作時遇到的問題,因此我決定複製它。另外,我已經寫完了答案!跨域不能使用SignalR PersistentConnection

我在ASP.NET MVC .NET Framework 4項目中運行SignalR 1.0.1服務器。我在另一個域(不同的本地主機端口)嘗試通過JavaScript客戶端連接另一個ASP.NET應用程序。我得到這個,當我的應用程序試圖連接:

XMLHttpRequest cannot load http://localhost:31865/api/negotiate?_=1363105027533. 
Origin http://localhost:64296 is not allowed by Access-Control-Allow-Origin. 

我已經執行了所有步驟,從而實現跨域支持,SignalR - 我缺少什麼?

  • jQuery.support.cors = true;
  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
  • RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
  • RouteTable.Routes.MapConnection<ApiConnection>("/api", "api");

我還添加在API項目中的以下到Web.config中:

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

我ü爲我的SignalR服務器唱一個PersistentConnection,而不是集線器。

任何想法?

+0

你好@ halter73,你能否給我提供一個使用signalR的多個聊天室的演示。我想實現像chat.stackoverflow.com聊天服務器或任何鏈接。請幫幫我。我有一個演示,但沒有工作。可以通過電子郵件給我的演示? – 2015-12-09 05:55:57

+0

我的電子郵件地址是:[email protected]。如果你有任何演示請發給我。 – 2015-12-09 06:31:21

回答

15

MapHubs將在/ signalr上配置一個端點用於與所有Hub類進行通信。由於您未使用集線器,因此撥打MapHubs是不必要的。對MapHubs的調用也不會影響/ api連接的配置。

您對MapConnection呼叫應改爲如下:

RouteTable.Routes.MapConnection<ApiConnection>("api", "api", 
    new ConnectionConfiguration { EnableCrossDomain = true }); 

注:的第二個參數是MapConnection的URL。第一個參數是路由名稱。 /是不必要的,但在任何情況下都不會受到傷害。

  • 設置jQuery.support.cors = true;應該ONLY完成「若要在不支持CORS尚未環境跨域請求但允許跨域XHR請求(Windows小工具,等等)」 [1]。這不涉及任何版本的IE或我知道的任何其他瀏覽器。如果瀏覽器不支持CORS,SignalR將自動回退到JSONP ,除非您將jQuery.support.cors設置爲true。

    如果你只是設置爲true盲目,SignalR將假定環境不支持跨域XHR請求和自動回落到JSONP渲染SignalR無法建立跨域連接在瀏覽器中運行,真正當不支持CORS。

  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });不正確。您應該只需要

    var connection = $.connection('http://localhost:31865/api'); 
    

    xdomain不再爲SignalR JS客戶的選擇,如果你真的要指定jsonp,你應該這樣做,當你start像這樣的連接:

    connection.start({ jsonp: true}).done(function() { /* ... */ }); 
    

    我要重申,SignalR將自動回落到JSONP如果環境不支持CORS,所以你不應指定此運算你自己。 JSONP不需要Access-Control-Allow-Origin標頭,但它確實強制SignalR使用其最低效的傳輸:長輪詢。

  • 您不需要在Web.config中設置customHeaders。當您在ConnectionConfiguration中將EnableCrossDomain設置爲true時,SignalR將自動設置SignalR響應中的Access-Control-Allow-Origin標頭。

參考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections更多的建議使用PersistentConnections