Comment travailler avec des Web Sockets dans .Net

Un socket Web est une connexion de socket TCP entre le client et le serveur sur un réseau. Essentiellement, un socket Web est une communication bidirectionnelle en duplex intégral entre le client et le serveur sur un réseau. La demande croissante de messagerie en temps réel à faible latence pour les applications Web et mobiles a conduit à l'avènement des sockets Web. Il s'agit d'un protocole qui vous permet de fournir une communication en temps réel, rapide et bidirectionnelle dans vos applications sans avoir à compromettre l'expérience utilisateur.

WebSockets est un protocole basé sur les messages qui tire parti d'une connexion TCP en continu. L'espace de noms System.Net.WebSockets prend en charge l'utilisation des sockets Web dans .Net. Notez qu'une connexion Web socket entre un serveur et une application cliente est établie via un échange de liaison HTTP entre eux.

Le MSDN déclare: "Les WebSockets permettent aux navigateurs d'ouvrir un canal de communication bidirectionnel, duplex intégral avec des services. Chaque partie peut ensuite utiliser ce canal pour envoyer immédiatement des données à l'autre. Désormais, les sites de réseaux sociaux et de jeux vers les sites financiers peuvent offrir de meilleurs résultats. scénarios en temps réel, utilisant idéalement le même balisage sur différents navigateurs. "

Vous pouvez en savoir plus sur le protocole WebSocket ici.

Utilisation des WebSockets dans .Net

Lorsque vous hébergez vos sockets Web côté serveur à l'aide de .Net, vous avez plusieurs choix. Vous pouvez héberger un serveur WebSocket dans des applications ASP.Net ou ASP.Net MVC traditionnelles. Pour ce faire, vous devez tirer parti de HttpContext.AcceptWebSocketRequest. Vous pouvez alors disposer d'une application Web côté client pour vous connecter au socket Web et communiquer pour l'échange de messages. Vous pouvez également créer un service WCF qui utilise netHttpBinding et tirer parti d'un CallbackContract dans votre service. Vous pouvez alors profiter de HttpContext.AcceptWebSocketRequest ou même tirer parti de WebSocketHandler ou WebSocketHost disponible dans le cadre de Microsoft.WebSockets.dll.

Du côté client, vous pouvez profiter de HTML5 et de jQuery dans votre page Web. Vous pouvez également tirer parti de la classe ClientWebSocket pour créer une application cliente ou même utiliser un client WCF pour vous connecter au socket Web.

Notez que l'objet HttpContext maintenant (depuis .Net Framework 4.5) contient une nouvelle propriété appelée IsWebSocketRequest. Vous pouvez tirer parti de cette propriété de l'objet HttpContext pour vérifier si une demande entrante est une demande de socket Web. La liste de code suivante montre comment créer un socket Web à l'aide de HttpHandler.

public class Service : IHttpHandler

   {

       public void ProcessRequest(HttpContext context)

       {

           if (context.IsWebSocketRequest)

               context.AcceptWebSocketRequest(ProcessRequestInternal);

           else

               context.Response.StatusCode = 400;

       }

       public bool IsReusable

       {

           get

            {

               return false;

           }

       }

       private async Task ProcessRequestInternal(AspNetWebSocketContext context)

       {

           WebSocket socket = context.WebSocket;

             while(true)

           {

               //Write your code here to process the request

           }

       }

   }

Vous devez enregistrer le gestionnaire Http dans le fichier web.config de votre application. Voici l'extrait de code qui montre comment procéder.

  

    

           type="Web.Handler"/>

  

You can also use web sockets in your Web API controllers. Incidentally, ASP.Net Web API is a lightweight framework used for building RESTful services that run on HTTP. RESTful services are light-weight, stateless, client-server based, cacheable services that are based on the concept of resources. The following code snippet illustrates how you can implement a web socket in your Web API controller method -- note the usage of HttpContext.AcceptWebSocketRequest to accept and establish connections.

public class WebSocketController : ApiController

{

       [HttpGet]

       public HttpResponseMessage GetMessage()

       {

           if (HttpContext.Current.IsWebSocketRequest)

           {

               HttpContext.Current.AcceptWebSocketRequest(ProcessRequestInternal);

           }

           return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);

       }

          private async Task ProcessRequestInternal(AspNetWebSocketContext context)

          {

          //Write your code here to process the request

         }

}

At the client side, you would need to connect to the web socket by specifying the URI used to send the WebSocket connection request.

var webSocket = new WebSocket("ws://" + window.location.hostname +

                   "/Web/api/WebSocket");

                   webSocket.onopen = function () {

                   $("#status").text("Connected...");

               };

You can also take advantage of the new Microsoft.Web.WebSockets.WebSocketHandler class to implement web sockets now. To use this class, you would need to install the Microsoft.WebSockets package via NuGet Package Manager. Alternatively, you can install the same package by running the following command in the NuGet Package Manager Console.

Install-Package Microsoft.WebSockets

The following code snippet shows how you can extend the WebSocketHandler class to create your own custom handler.

public class WebSocketHandler : WebSocketHandler

   {

       private static WebSocketCollection socketClients = new WebSocketCollection();

       public override void OnOpen()

       {

           socketClients.Add(this);

           socketClients.Broadcast("This is for all connected clients...");

           this.Send("Hello from: " + this.WebSocketContext.UserHostAddress);

       }

       public override void OnClose()

       {

           base.OnClose();

       }

       public override void OnError()

       {

           base.OnError();

        }

   }