Hur man arbetar med webbuttag i .Net

Ett webbuttag är en TCP-uttagsanslutning mellan klienten och servern via ett nätverk. I huvudsak är ett webbuttag en tvåvägs full duplexkommunikation mellan klienten och servern via ett nätverk. Den ökande efterfrågan på realtid, meddelanden med låg latens för webb, både mobilapplikationer har lett till tillkomsten av webbuttag. Detta är ett protokoll som gör att du kan tillhandahålla snabb, dubbelriktad kommunikation i realtid i dina applikationer utan behov av att kompromissa med användarupplevelsen.

WebSockets är ett meddelandebaserat protokoll som utnyttjar en TCP-strömad anslutning. System.Net.WebSockets namnutrymme ger stöd för att arbeta med webbuttag i .Net. Observera att en webbuttagsanslutning mellan en server och en klientapplikation upprättas genom ett HTTP-handskakningsutbyte mellan dem.

MSDN säger: "WebSockets gör det möjligt för webbläsare att öppna en dubbelriktad kommunikationskanal i full duplex med tjänster. Varje sida kan sedan använda den här kanalen för att omedelbart skicka data till den andra. Nu kan webbplatser från sociala nätverk och spel till finansiella webbplatser leverera bättre realtidsscenarier, helst med samma markering i olika webbläsare. "

Du kan lära dig mer om WebSocket-protokollet här.

Arbeta med WebSockets i .Net

När du är värd för dina webbuttag på serversidan med .Net har du några val. Du kan vara värd för en WebSocket-server i traditionella ASP.Net- eller ASP.Net MVC-applikationer. För att göra detta måste du dra nytta av HttpContext.AcceptWebSocketRequest. Du kan sedan ha en webbapplikation på klientsidan för att ansluta till webbuttaget och kommunicera för utbyte av meddelanden. Du kan också skapa en WCF-tjänst som använder netHttpBinding och dra nytta av en CallbackContract i din tjänst. Du kan sedan dra nytta av HttpContext.AcceptWebSocketRequest eller till och med utnyttja WebSocketHandler eller WebSocketHost som finns som en del av Microsoft.WebSockets.dll.

På klientsidan kan du dra nytta av HTML5 och jQuery på din webbsida. Du kan också använda klassen ClientWebSocket för att skapa en klientapplikation eller till och med använda en WCF-klient för att ansluta till webbuttaget.

Observera att HttpContext-objektet nu (sedan .Net Framework 4.5) innehåller en ny egenskap som heter IsWebSocketRequest. Du kan dra nytta av den här egenskapen för HttpContext-objektet för att kontrollera om en inkommande begäran är en webbuttagsbegäran. Följande kodlista visar hur du kan skapa ett webbuttag med 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

           }

       }

   }

Du bör registrera Http-hanteraren i programmets web.config-fil. Här är kodavsnittet som visar hur du ska göra detta.

  

    

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

        }

   }