https://github.com/sulmar/dotnet-core-websocket
Przykład obsługi WebSocket w .NET Core
https://github.com/sulmar/dotnet-core-websocket
dotnet-core3 websocket
Last synced: 2 days ago
JSON representation
Przykład obsługi WebSocket w .NET Core
- Host: GitHub
- URL: https://github.com/sulmar/dotnet-core-websocket
- Owner: sulmar
- Created: 2020-04-07T08:14:08.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-04-07T09:46:53.000Z (about 6 years ago)
- Last Synced: 2025-02-21T20:13:28.755Z (over 1 year ago)
- Topics: dotnet-core3, websocket
- Language: C#
- Size: 18.6 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Websocket w .NET Core 3 z użyciem Endpoints
## Wprowadzenie
Opis użycia WebSocket w .NET Core znajduje się w artykule [WebSockets support in ASP.NET Core](https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1)
Przedstawiony tam sposób używa przechwytywania żądań za pomocą metody *Use()*. Postanowiłem przerobić to na endpoint, które w .NET Core 3 są zalecanym sposobem mapowania żądań.
Przedstawię poszczególne sposoby mapowania.
## Przykładowa metoda *Echo()*
~~~ csharp
private async Task Echo(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
await webSocket.SendAsync(new ArraySegment(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
~~~
## Mapowanie z użyciem IApplicationBuilder
~~~ csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Map("/ws", builder =>
{
builder.Use(async (context, next) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await Echo(webSocket);
return;
}
await next();
});
});
}
~~~
## Mapowanie z użyciem endpoints
~~~ csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.Map("/ws", async (context) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await Echo(webSocket);
}
});
}
~~~
## Utworzenie metody rozszerzającej
~~~ csharp
public static class WebSocketEndpointRouteBuilderExtensions
{
public static IEndpointConventionBuilder MapWebSocket(
this IEndpointRouteBuilder endpoints,
string pattern,
Func execute = null)
{
return endpoints.Map(pattern, async (context) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await execute?.Invoke(webSocket);
}
});
}
}
~~~
~~~ csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
endpoints.MapWebSocket("/ws", async websocket => await Echo(websocket));
}
~~~