So arbeiten Sie mit Web Sockets in .Net

Ein Web-Socket ist eine TCP-Socket-Verbindung zwischen dem Client und dem Server über ein Netzwerk. Ein Web-Socket ist im Wesentlichen eine bidirektionale Vollduplex-Kommunikation zwischen dem Client und dem Server über ein Netzwerk. Die steigende Nachfrage nach Echtzeitnachrichten mit geringer Latenz für mobile Webanwendungen hat zum Aufkommen von Web-Sockets geführt. Dies ist ein Protokoll, mit dem Sie eine schnelle, bidirektionale Kommunikation in Echtzeit in Ihren Anwendungen bereitstellen können, ohne Kompromisse bei der Benutzererfahrung eingehen zu müssen.

WebSockets ist ein nachrichtenbasiertes Protokoll, das eine TCP-Streaming-Verbindung nutzt. Der System.Net.WebSockets-Namespace bietet Unterstützung für die Arbeit mit Web-Sockets in .Net. Beachten Sie, dass eine Web-Socket-Verbindung zwischen einem Server und einer Client-Anwendung über einen HTTP-Handshake-Austausch zwischen diesen hergestellt wird.

In der MSDN heißt es: "Mit WebSockets können Browser einen bidirektionalen Vollduplex-Kommunikationskanal mit Diensten öffnen. Jede Seite kann diesen Kanal dann verwenden, um sofort Daten an die andere zu senden. Jetzt können Websites von sozialen Netzwerken und Spielen bis hin zu Finanzwebsites bessere Ergebnisse erzielen Echtzeitszenarien, idealerweise mit demselben Markup in verschiedenen Browsern. "

Weitere Informationen zum WebSocket-Protokoll finden Sie hier.

Arbeiten mit WebSockets in .Net

Wenn Sie Ihre Web-Sockets mit .Net auf der Serverseite hosten, haben Sie einige Möglichkeiten. Sie können einen WebSocket-Server in herkömmlichen ASP.Net- oder ASP.Net MVC-Anwendungen hosten. Dazu müssten Sie HttpContext.AcceptWebSocketRequest nutzen. Sie können dann eine Webanwendung auf der Clientseite einrichten, um eine Verbindung zum Web-Socket herzustellen und für den Nachrichtenaustausch zu kommunizieren. Sie können auch einen WCF-Dienst erstellen, der netHttpBinding verwendet, und einen CallbackContract in Ihrem Dienst nutzen. Sie können dann HttpContext.AcceptWebSocketRequest nutzen oder sogar WebSocketHandler oder WebSocketHost nutzen, die als Teil von Microsoft.WebSockets.dll verfügbar sind.

Auf der Clientseite können Sie HTML5 und jQuery auf Ihrer Webseite nutzen. Sie können auch die ClientWebSocket-Klasse nutzen, um eine Clientanwendung zu erstellen, oder sogar einen WCF-Client verwenden, um eine Verbindung zum Web-Socket herzustellen.

Beachten Sie, dass das HttpContext-Objekt jetzt (seit .Net Framework 4.5) eine neue Eigenschaft namens IsWebSocketRequest enthält. Sie können diese Eigenschaft des HttpContext-Objekts nutzen, um zu überprüfen, ob eine eingehende Anforderung eine Web-Socket-Anforderung ist. Die folgende Codeliste zeigt, wie Sie mit HttpHandler einen Web-Socket erstellen können.

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

           }

       }

   }

Sie sollten den HTTP-Handler in der Datei web.config Ihrer Anwendung registrieren. Hier ist das Code-Snippet, das zeigt, wie Sie dies tun sollten.

  

    

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

        }

   }