ASP.NET Core WebSocket 提供了對 WebSocket 協議的支持,使得在 ASP.NET Core 應用程序中處理實時通信變得簡單。以下是如何在 ASP.NET Core 中使用 WebSocket 的基本步驟:
首先,創建一個繼承自 WebSocketMiddleware
的類,并重寫 InvokeAsync
方法。在這個方法中,你可以處理 WebSocket 連接、消息和關閉事件。
public class MyWebSocketMiddleware
{
private readonly RequestDelegate _next;
public MyWebSocketMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path == "/ws")
{
// 處理 WebSocket 連接
await HandleWebSocketConnection(context);
}
else
{
// 處理其他請求
await _next(context);
}
}
private async Task HandleWebSocketConnection(HttpContext context)
{
// 創建一個 WebSocket 連接
var webSocket = new ClientWebSocket();
// 連接到 WebSocket 服務器
var connectionOptions = new WebSocketOptions
{
SubProtocol = "my-protocol"
};
await webSocket.ConnectAsync(new Uri("ws://your-websocket-server"), connectionOptions);
// 讀取和發送消息
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result;
do
{
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.CloseStatus != null)
{
// 處理 WebSocket 關閉事件
break;
}
// 處理接收到的消息
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received message: {message}");
// 發送消息回客戶端
var responseMessage = Encoding.UTF8.GetBytes($"Echo: {message}");
await webSocket.SendAsync(new ArraySegment<byte>(responseMessage), result.MessageType, result.CloseStatus.Value == WebSocketCloseStatus.NormalClosure);
}
while (!result.CloseStatus.HasValue);
// 關閉 WebSocket 連接
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
}
Startup.cs
中注冊 WebSocket 中間件:在 Startup.cs
文件的 Configure
方法中,將新創建的 WebSocket 中間件添加到中間件管道中。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// 注冊 WebSocket 中間件
app.UseMiddleware<MyWebSocketMiddleware>();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
現在,當客戶端連接到 /ws
路徑時,將使用 MyWebSocketMiddleware
類處理 WebSocket 連接。你可以在 HandleWebSocketConnection
方法中根據需要實現自定義邏輯,例如處理消息、廣播消息給其他客戶端等。