web-dev-qa-db-fra.com

SignalR avec Web Sockets

J'essaie de faire fonctionner les websockets dans mon environnement de développement:

  • Visual Studio 2010
  • Windows 7
  • Signal R 0.51
  • Dernières Chrome/Firefox

Malheureusement, le client Javscript utilise une interrogation longue. Lorsque je force des sockets Web côté client, je ne peux pas me connecter du tout:

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

Le code serveur est auto-hébergé et basé sur l'exemple. Il ressemble à ceci:

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

J'ai cherché autour et rien trouvé de définitif. Dois-je spécifier des éléments supplémentaires, utiliser Visual Studio 2012 ou cela ne fonctionnera-t-il que sous Windows 8/IIS 8?

29
Luke Belbina

Sur la base de cette réponse https://stackoverflow.com/a/9135334/700926 , vous verrez que la prise en charge de WebSocket dans SignalR s'appuie sur Windows 8/IIS8 - la réponse pointe également vers une page de wiki située sur la page github de SignalR, cependant. , cette page n'existe plus.

Mais, en clonant le dépôt wiki dans github et en remontant quelques révisions, vous verrez la documentation du projet SignalR.WebSockets qui, selon la page github de SignalR, n'existe plus (ce qui pourrait expliquer pourquoi le site wiki a été supprimé). une révision de la page de wiki pour SignalR.WebSockets à partir de février de cette année, il a déclaré que:

Les SignalR.WebSockets Un package peut être ajouté à un projet SignalR existant pour autoriser les clients se connecter à l’aide de WebSocket protocole . Le signalR Le client jQuery tentera automatiquement de se connecter via WebSockets (si le navigateur le prend en charge), aucune modification n'est donc nécessaire sur le client côté pour ajouter WebSockets à votre application basée sur SignalR.

SignalR.WebSockets s'appuie sur Microsoft.WebSockets afin d'écouter les connexions WebSocket entrantes à partir de ASP.NET. Ce paquet dépend à son tour de la nouvelle prise en charge de WebSockets cela a été ajouté à ASP.NET 4.5 et IIS 8.0. En conséquence, le Le package SignalR.WebSockets fonctionnera uniquement sur un ordinateur Windows 8 (.NET 4.5 s'installera sur des versions antérieures de Windows, mais Windows 8 est requis pour IIS 8.0). Pour plus d'informations sur la configuration d'un système Windows 8 machine (en utilisant l'aperçu du développeur) voir ici .

J'ai essayé de rechercher des informations plus récentes que celles que j'ai pu fournir ci-dessus, mais pour autant que je sache, le wiki de SignalR ne couvre pas explicitement ce sujet dans sa version actuelle.

23
Lasse Christiansen

Même sous Windows 8/.NET 4.5, il ne fonctionnait pas initialement, mais avec ces astuces supplémentaires, je l’ai enfin fait fonctionner.

  • Installer le support websocket

    -> Turn Windows features on or off
    -> Internet Information Services 
    -> World Wide Web Services 
    -> Application Development Features 
    -> WebSocket Protocol
    
  • dans web.config, sous appSettings, ajoutez ce paramètre: 

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

SignalR négocie automatiquement les Websockets, il n'est pas nécessaire de le spécifier et rien de spécial n'est nécessaire dans le code.

55
Maarten

Signal R fonctionne également sur Windows 7, IIS 7.5 et Visual Studio 2012. Le seul inconvénient est qu’il utilisera longPolling comme protocole de transport.

Afin d'utiliser avec succès signalR avec la configuration ci-dessus, nous devons configurer quelques éléments, qui ne sont en réalité détaillés dans aucun des didacticiels de signalR.

Ainsi, côté serveur (victoire 7, IIS 7.5) lorsque vous créez la connexion et le proxy, vous devez procéder comme suit:

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

Bien sûr, du côté du client, vous devez spécifier le protocole de transport comme étant 'longPooling':

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

Outre les solutions ci-dessus pour la résolution des problèmes liés aux WebSockets dans SignalR, si vous vous trouvez dans un réseau d'entreprise (ou quelque chose de similaire), il est probable que vos proxies et vos pare-feu interfèrent avec la poignée de main.

Mais si vous y accédez via SSL, le wrapper fourni le protège de cette interférence dans de nombreux cas.

0
Bon