簡體   English   中英

跨域不適用於SignalR PersistentConnection

[英]Cross-domain will not work with a SignalR PersistentConnection

注意 :其他人最初問過這個問題,但在我發布答案之前刪除了它。 由於這個問題涵蓋了開發人員在嘗試使SignalR跨域工作時遇到的許多問題,因此我決定復制它。 另外,我已經寫完了答案!

我在ASP.NET MVC .NET Framework 4項目中運行SignalR 1.0.1服務器。 我在另一個域(不同的localhost端口)上嘗試通過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,而不是集線器。

有任何想法嗎?

MapHubs將在/ signalr處配置端點,以便與所有Hub類進行通信。 由於您沒有使用集線器,因此不需要調用MapHubs MapHubs的調用也不會對/ api連接的配置產生任何影響。

您對MapConnection的調用應更改為如下所示:

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

注意: MapConnection的第二個參數是URL。 第一個參數是路徑名稱。 /是不必要的,但在任何一種情況下都沒有真正傷害。

  • 設置jQuery.support.cors = true; 應“若要在不支持CORS尚未環境跨域請求但允許跨域XHR請求(Windows小工具,等等)” [1] 這與IE的任何版本或我所知道的任何其他瀏覽器無關。 如果瀏覽器不支持CORS,則除非jQuery.support.cors設置為true, 否則 SignalR將自動回退到JSONP。

    如果您只是盲目地將其設置為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 () { /* ... */ }); 

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

  • 您無需在Web.config中設置customHeaders SignalR將設置Access-Control-Allow-Origin ,當你設置自動SignalR響應頭EnableCrossDomain在你真正ConnectionConfiguration

參考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections以獲得有關使用PersistentConnections更多建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM