2012-07-22 125 views
27

我試圖讓WebSockets的在我的開發環境中工作:SignalR與網絡套接字

  • Visual Studio 2010中
  • 的Windows 7
  • 信號R 0.51
  • 最新的Chrome/Firefox的

不幸的是Javscript客戶端正在使用長輪詢。當我強迫在客戶端網絡套接字我無法連接在所有:

$.connection.hub.start({ transport: ['webSockets'] }) 

Server代碼是自託管,並根據樣本,看起來像:

static void Main(string[] args) 
{ 
    string url = "http://localhost:8081/"; 
    var server = new Server(url); 

    // Map the default hub url (/signalr) 
    server.MapHubs(); 

    // Start the server 
    server.Start(); 

    Console.WriteLine("Server running on {0}", url); 

    // Keep going until somebody hits 'x' 
    while (true) 
    { 
     ConsoleKeyInfo ki = Console.ReadKey(true); 
     if (ki.Key == ConsoleKey.X) 
     { 
      break; 
     } 
    } 
} 

public class MyHub : Hub 
{    
    public void Send(string message) 
    { 
     Clients.addMessage(message); 
    } 
} 

我已經四處搜查,沒有發現任何明確的。我是否需要指定一些額外的東西,使用Visual Studio 2012還是隻能在Windows 8/IIS 8上使用?

回答

22

根據這個答案https://stackoverflow.com/a/9135334/700926你會看到SignalR中的WebSocket支持依賴於Windows 8/IIS8 - 答案也指向了SignalR的github頁面上的一個wiki頁面,但是,該頁面不再存在。

但是,通過克隆github上的wiki repo並返回一些修訂,您將看到根據SignalR的github頁面的SignalR.WebSockets項目的文檔不再存在 - (這可能解釋了爲什麼wiki網站被刪除) - 然而,從今年二月WIKIPAGE爲SignalR.WebSockets的修訂版,它指出:

SignalR.WebSockets 包可以被添加到現有的SignalR項目,以允許客戶 使用WebSocket protocol連接。 SignalR jQuery客戶端將自動嘗試通過WebSockets進行連接(如果瀏覽器支持它,則 ),因此客戶端 一側不需要進行任何更改,以便將WebSocket添加到基於SignalR的應用程序。

SignalR.WebSockets以監聽來自內 ASP.NET傳入WebSocket連接依賴於 Microsoft.WebSockets 。這個程序包依次取決於添加到ASP.NET 4.5和IIS 8.0的新WebSocket支持 。因此, SignalR.WebSockets軟件包僅適用於Windows 8計算機(.NET 4.5將安裝在早期版本的Windows上,但IIS 8.0需要Windows 8)。有關如何設置Windows的更多信息(使用開發人員預覽),請參閱 here

我試過尋找比上面提供的信息更新的信息,但據我所知,SignalR維基在當前版本中沒有明確說明這個話題。

+6

這已經過時了,但websocket支持依然依賴於windows 8. – davidfowl 2012-07-22 19:39:24

+1

您可以在自己託管的應用程序中實際使用WebSocket,而無需Windows 8/2012,IIS 8或.NET 4.5。我解釋一下如何在這裏執行此操作的技巧:http://stackoverflow.com/a/18337019/564726 – BrutalDev 2014-02-05 08:52:53

50

即使在Windows 8/.NET 4.5上它最初也沒有工作,但有了這些額外的提示,我終於得到了它的工作。

  • 安裝WebSocket的支持

    -> Turn Windows features on or off 
    -> Internet Information Services 
    -> World Wide Web Services 
    -> Application Development Features 
    -> WebSocket Protocol 
    
  • 在web.config中

    下的appSettings,添加此設置:

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    

SignalR自動協商的WebSockets,它不必被指定,代碼中不需要任何特殊的東西。

+0

真棒。本週末要安裝Windows 8虛擬機,我確信這真的會有幫助。 – 2012-08-01 19:03:35

+2

完美的解決方案 - 默認情況下,第一部分在Azure Server2012中完成。添加了web.config設置和Web套接字連接開始工作:-) - 謝謝Maarten! – viperguynaz 2013-05-22 01:25:42

+2

爲什麼這是這麼難找到..真棒... :) – KingOfHypocrites 2014-05-06 22:15:56

1

Signal R在Windows 7,IIS 7.5和Visual Studio 2012上也可以工作。唯一的缺點是它將使用longPolling作爲傳輸協議。

爲了成功使用signalR與上述配置,我們需要設置一些東西,實際上在任何signalR教程中都沒有詳細說明。

因此,在服務器端(WIN 7,IIS 7.5)當您創建連接和代理,你必須做這樣的事情:

Connection = new HubConnection('someUrl', false); 
Proxy = Connection.CreateHubProxy('myHubProxy'); 
Connection.Start(new LongPollingTransport()).Wait(); // notice the specification of transport 

當然,在客戶端以同樣的方式你必須指定傳輸協議爲「longPooling」:

var connection = $.hubConnection('myUrl', { useDefaultPath: false }); 
connection.start({ transport: ['websockets', 'longPolling'], jsonp: true, xdomain: true }) 
0

除了在SignalR故障排除的WebSockets問題的上述解決方案,如果你是一個企業網絡(或者一些類似的結構)內很可能是你的代理和防火牆會干擾wi握手。

但是,如果您通過SSL訪問它,它提供的包裝會在很多情況下保護它免受這種干擾。