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
方法中根据需要实现自定义逻辑,例如处理消息、广播消息给其他客户端等。