Gdyby korzystać z frameworka ASP.NET w wersji 4 to do wymiany danych w czasie rzeczywistym można wykorzystać SignalR framework. Niestety nie ma jeszcze stabilnego wydania tego narzędzia dla dotnet core.

SignalR to “kombajn”, który potrafi sobie poradzić nawet w przypadku, gdy nasza przeglądarka nie obsługuje WebSocketów, możesz o tym poczytaj tutaj;

Prace nad SignalR dla core trwają ale Microsoft wydał paczkę WebSockets, która pozwala uruchomić serwer WebSocketowy.

Czego nauczysz się z tego wpisu?

W tym wpisie pokażę Ci jak uruchomić i skonfigurować własny serwer websocketów w projekcie ASP .NET Core.

Paczka z nuget

Moim punktem wejściowym jest nowy projekt ASP NET Core Mvc.

Dodaj paczkę z nugeta: Microsoft.AspNetCore.WebSockets

Konfiguracja middleware

Dodaj WebSocket middleware w metodzie Configure w pliku Startup.cs

app.UseWebSockets();

Obsłużenie zapytań WebSocket

Stwórz metodę Echo w HomeController

public async void Echo()
{
    if(HttpContext.WebSockets.IsWebSocketRequest){
        WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
        await Echo(HttpContext, webSocket);
    }
    else{
        HttpContext.Response.StatusCode = 400;
    }
}

Odebieranie i wysyłanie wiadomości

HttpContext.WebSockets.AcceptWebSocketAsync() jest tu najważniejsze. To te wywołanie zmiania połączenie TCP na WebSocketowe, więc w konsekwencji ta akcja obsłuży punkt dostępowy do WebSocketa a nie zapytanie http. Wywołanie te zwraca objekt WebSocket.

private async Task Echo(HttpContext context, WebSocket webSocket)
{
	var buffer = new byte[1024 * 4];
	WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
	while (!result.CloseStatus.HasValue)
	{
		await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);

		result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
	}
	await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}

Testowanie

Do testowanie użyłem bardzo prostego skryptu w Pythonie.

Zainstalowałem paczkę websocket-client

pip install websocket-client

A następnie skopiowałem przykład z repozytorium i podmieniłem url.

from websocket import create_connection
ws = create_connection("ws://localhost:61322/Home/Echo")
print("Sending 'Hello, World'...")
ws.send("Hello, World")
print("Sent")
print("Receiving...")
result =  ws.recv()
print("Received '%s'" % result)
ws.close()

Test wyszedł pozytywanie, mój prosty websocketowy serwer działa.

Obrazek

Podsumowanie

Jak już pewnie zauważyłeś metoda Echo nie wygląda zbyt przyjaźnie. Poszukałem chwilę i udało mi się znaleźć bardzo interesujące rozwiązanie na GitHubie - WebSocket Manager. Tutaj znajdziesz instrukcję jak z niego skorzystać - Real Time ASP .NET Core

Kompletny przykład znajdziesz tutaj