要在 ASP.NET Core 中創建 WebSocket API,您可以按照以下步驟操作:
設置新的 ASP.NET Core 項目
打開 Visual Studio 或您喜歡的 IDE。
創建一個新的 ASP.NET Core Web 應用程序項目。
選擇API模板,因為這將成為您的 WebSocket API 的基礎。
在啟動時添加 WebSocket 支持
打開Startup.cs(或Program.cs在 .NET 6 或更高版本中)。
在Configure方法中,通過調用添加 WebSocket 支持 UseWebSockets()。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
? ? // Enable WebSocket support
var webSocketOptions = new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromSeconds(120),
ReceiveBufferSize = 4096
};
app.UseWebSockets(webSocketOptions);
? ? app.UseRouting();
? ? app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
創建 WebSocket 處理程序
創建將處理 WebSocket 連接的新服務或類。
public class WebSocketHandler
{
private readonly WebSocket _webSocket;
? ? public WebSocketHandler(WebSocket webSocket)
{
_webSocket = webSocket;
}
? ? public async Task HandleWebSocketAsync(CancellationToken cancellationToken)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result;
do
{
result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// Process message or forward it
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", cancellationToken);
}
} while (!cancellationToken.IsCancellationRequested);
}
}
創建 WebSocket 控制器
在您的Controllers文件夾中,創建一個監聽 WebSocket 連接的新控制器。
[ApiController]
[Route("api/[controller]")]
public class WebSocketController : ControllerBase
{
private readonly WebSocketHandler _webSocketHandler;
? ? public WebSocketController(WebSocketHandler webSocketHandler)
{
_webSocketHandler = webSocketHandler;
}
? ? [HttpGet("connect")]
public async Task<IActionResult> Connect(CancellationToken cancellationToken)
{
if (!HttpContext.WebSockets.IsWebSocketRequest)
{
return BadRequest("WebSocket request expected");
}
? ? ? ? var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await _webSocketHandler.HandleWebSocketAsync(cancellationToken);
? ? ? ? return Ok();
}
}
配置依賴注入
在Startup.cs(或Program.cs在 .NET 6 中)將其注冊 WebSocketHandler為服務。
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<WebSocketHandler>();
services.AddControllers();
}
處理 WebSocket 消息
在您的 中WebSocketHandler,您可以添加邏輯來處理 WebSocket 消息。這包括讀取、發送和處理不同類型的消息。
例如,在HandleWebSocketAsync方法中:
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// Send a response back to the client
var response = Encoding.UTF8.GetBytes($"You said: {message}");
await _webSocket.SendAsync(new ArraySegment<byte>(response), WebSocketMessageType.Text, true, cancellationToken);
}
運行應用程序
現在,運行您的應用程序。您可以使用 WebSocket 客戶端(例如 Postman、WebSocket 測試工具)或瀏覽器中的自定義 JavaScript 客戶端來測試 WebSocket API。
使用 JavaScript 測試 WebSocket
您可以使用 JavaScript 測試您的 WebSocket API,如下所示:
const socket = new WebSocket('ws://localhost:5000/api/websocket/connect');
socket.onopen = () => {
console.log('WebSocket connection established');
socket.send('Hello WebSocket Server!');
};
socket.onmessage = (event) => {
console.log('Message from server:', event.data);
};
socket.onclose = () => {
console.log('WebSocket connection closed');
};
處理錯誤和超時
為 WebSocket 邏輯添加適當的錯誤處理。處理客戶端斷開連接或超時等情況。
確保處理入站和出站消息場景。
完成這些步驟后,您已在 ASP.NET Core 中創建了一個 WebSocket API!這允許您在客戶端(例如,瀏覽器或移動應用程序)和服務器之間發送和接收實時數據。
如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。?