Webソケットを開いてエンドユーザーに接続できますが、特定のルートを経由するだけですか?Open Web Socket現在のルートに依存C#asp net core
のは、私は以下の機能を持ったWeb APIを持っていると仮定しましょう:ルート上の
記事セクション:ルート上/記事
チャットモジュール:/
現時点では、エンドユーザーが使用するルート上ですべてのws要求を独立して処理するWebソケットミドルウェアがあります。
したがって、理論的には、アプリケーションのフロントレイヤーのどの場所にもWebソケット接続を確立することができます。コードを書くだけであれば可能です。
私はそれが欲しくないので、どうすればそのような状況を防ぐことができますか?
以下は私の現在のソリューションです:
using System;
using System.IO;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace chat.Framework
{
public class WebSocketMiddleware
{
private readonly RequestDelegate _next;
private WebSocketHandler _webSocketHandler;
public WebSocketMiddleware(RequestDelegate next, WebSocketHandler webSocketHandler)
{
_next = next;
_webSocketHandler = webSocketHandler;
}
public async Task Invoke(HttpContext context)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await _next.Invoke(context);
return;
}
var socket = await context.WebSockets.AcceptWebSocketAsync();
await _webSocketHandler.OnConnected(socket);
await Recive(socket, async(result, buffer) =>
{
if(result.MessageType == WebSocketMessageType.Text)
{
await _webSocketHandler.Recive(socket, result, buffer);
return;
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocketHandler.OnDisconnected(socket);
Console.WriteLine("Disconnect");
return;
}
});
}
private async Task Recive(WebSocket socket, Action<WebSocketReceiveResult, byte[]> handle)
{
var buffer = new ArraySegment<byte>(new Byte[1024 * 4]);
WebSocketReceiveResult result = null;
var ms = new MemoryStream();
while(socket.State == WebSocketState.Open)
{
do
{
result = await socket.ReceiveAsync(buffer, CancellationToken.None);
} while (!result.EndOfMessage);
var newBuffer = new byte[result.Count];
Array.Copy(buffer.Array, newBuffer, result.Count);
handle(result, newBuffer);
Console.WriteLine(newBuffer.Length);
}
}
}
}
私がチャットサービスをゼロから作成したいのであれば、Webソケットを使用するよりも、SignalRを使用しています。 – Maritim
おそらく私はこのライブラリの現在のバージョンが十分に安定していないので、将来私はSignalRを使用します。そして、次の理由は、今のところライブラリ全体が必要ないということです。 – bielu000