2012-07-22 17 views
27

Sto tentando di ottenere WebSockets che lavorano nel mio ambiente dev:SignalR con Sockets Web

  • Visual Studio 2010
  • Windows 7
  • segnale R 0.51
  • recente Chrome/Firefox

Sfortunatamente il client Javscript utilizza il polling lungo. Quando forzo web socket sul lato client che non riesce a connettersi a tutti:

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

codice Server è self-hosted e sulla base del campione e si presenta come:

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); 
    } 
} 

ho cercò in giro e non trovò nulla di definitivo. Devo specificare alcune cose extra, utilizzare Visual Studio 2012 o funzionerà solo su Windows 8/IIS 8?

risposta

22

Sulla base di questa risposta https://stackoverflow.com/a/9135334/700926 vedrete che il supporto WebSocket in SignalR si basa su Windows 8/IIS8 - la risposta punta anche a una pagina wiki nella pagina github di SignalR, tuttavia, quella pagina non esiste più.

Ma, clonando il repo wiki a github e tornare alcune revisioni si vedrà la documentazione del progetto SignalR.WebSockets che secondo la pagina di GitHub di SignalR, non esiste più - (il che potrebbe spiegare il motivo per cui il sito wiki viene rimosso) - tuttavia, in una revisione del WikiPage per SignalR.WebSockets dal febbraio di quest'anno, ha dichiarato che:

il pacchetto SignalR.WebSockets possono essere aggiunti ad un progetto SignalR esistente per consentire ai client di connettersi utilizzando il WebSocket protocol. Il client jQuery SignalR tenterà automaticamente di connettersi tramite WebSockets (se il browser lo supporta) quindi non sono necessarie modifiche sul lato client per aggiungere WebSockets all'applicazione basata su SignalR.

SignalR.WebSockets si basa su Microsoft.WebSockets al fine di ascoltare le connessioni in entrata da websocket all'interno ASP.NET. A sua volta, questo pacchetto dipende dal nuovo supporto WebSockets aggiunto a ASP.NET 4.5 e IIS 8.0. Di conseguenza, il pacchetto SignalR.WebSockets funzionerà solo su un computer Windows 8 (.NET 4.5 verrà installato su versioni precedenti di Windows ma Windows 8 è richiesto per IIS 8.0). Per ulteriori informazioni su come configurare una macchina Windows 8 (utilizzando l'anteprima dello sviluppatore) vedere here.

Ho provato a cercare informazioni più recenti di quelle che sono stato in grado di fornire sopra, ma per quanto posso dire, il wiki SignalR non tratta questo argomento esplicitamente nella sua versione corrente.

+6

Questo è obsoleto ma il supporto websocket fa ancora affidamento su Windows 8. – davidfowl

+1

È possibile utilizzare WebSockets nell'applicazione ospitata autonomamente senza la necessità di Windows 8/2012, IIS 8 o .NET 4.5. Spiego una tecnica su come farlo qui: http://stackoverflow.com/a/18337019/564726 – BrutalDev

50

Anche su Windows 8/.NET 4.5 inizialmente non funzionava, ma con questi suggerimenti aggiuntivi ho finalmente funzionato.

  • Installare il supporto websocket

    -> Turn Windows features on or off 
    -> Internet Information Services 
    -> World Wide Web Services 
    -> Application Development Features 
    -> WebSocket Protocol 
    
  • nel web.config, sotto appsettings, aggiungere questa impostazione:

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

SignalR negozia automaticamente WebSockets, esso non deve essere specificato e nulla di speciale è necessario nel codice.

+0

fantastico. vado a prendere l'installazione di Windows 8 VM questo fine settimana e sono sicuro che questo sarà davvero d'aiuto. –

+2

Soluzione perfetta: la prima parte viene eseguita in Azure Server2012 per impostazione predefinita. Aggiunta l'impostazione web.config e la connessione web socket iniziata funzionante :-) - Grazie Maarten! – viperguynaz

+2

Perché diamine è stato così difficile da trovare .. Fantastico ... :) – KingOfHypocrites

1

Signal R funziona anche su Windows 7, IIS 7.5 e Visual Studio 2012. L'unico inconveniente è che utilizzerà longPolling come protocollo di trasporto.

Per utilizzare con successo signalR con la configurazione di cui sopra, è necessario impostare alcune cose, che in realtà non sono dettagliate in nessuno dei tutorial di signalR.

Quindi, sul lato server (vittoria 7, IIS 7.5) quando si crea la connessione e il proxy che si deve fare qualcosa di simile:

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

Naturalmente, sul lato client nello stesso modo in cui si è necessario specificare il protocollo di trasporto come 'longPooling':

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

in aggiunta alle soluzioni di cui sopra per i problemi WebSockets risoluzione dei problemi in SignalR, se si è all'interno di una rete aziendale (o qualcosa di simile strutturata) è probabile che il vostro i proxy e i firewall interferiranno la stretta di mano.

Ma se lo si accede tramite SSL, il wrapper che fornisce lo protegge da questa interferenza in molti casi.