ASP.NET Core WebSocket 提供了一种在客户端和服务器之间进行全双工通信的机制。以下是一些使用 ASP.NET Core WebSocket 的技巧:
安装依赖项:确保安装了 Microsoft.AspNetCore.Http.Abstractions 和 Microsoft.AspNetCore.WebSockets NuGet 包。
配置 WebSocket:在 Startup.cs 文件中配置 WebSocket 中间件。
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddWebSocket(options => { options.AllowedOrigins = new[] { "*" }; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapWebSocket("/ws", new WebSocketOptions() { KeepAliveInterval = TimeSpan.Zero }); }); } 处理 WebSocket 连接:创建一个类来处理 WebSocket 连接和消息。
public class MyWebSocketHandler { private readonly WebSocket _webSocket; public MyWebSocketHandler(WebSocket webSocket) { _webSocket = webSocket; } public async Task OnConnectedAsync(string userId) { await _webSocket.SendAsync(Encoding.UTF8.GetBytes($"Welcome, {userId}!")); } public async Task OnMessageReceivedAsync(string message) { var data = Encoding.UTF8.GetString(message); await _webSocket.SendAsync(Encoding.UTF8.GetBytes($"Echo: {data}")); } public async Task OnDisconnectedAsync(Exception exception) { Console.WriteLine($"Disconnected: {exception}"); } } 在控制器中使用 WebSocket:在控制器中处理 WebSocket 请求。
[HttpGet] public async Task<IActionResult> Index(string id) { if (HttpContext.WebSockets.IsWebSocketRequest()) { var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); var handler = new MyWebSocketHandler(webSocket); await handler.OnConnectedAsync(id); while (webSocket.State == WebSocketState.Open) { var buffer = new byte[1024 * 4]; WebSocketReceiveResult result; do { result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); } while (!result.CloseStatus.HasValue); var message = Encoding.UTF8.GetString(buffer, 0, result.Count); await handler.OnMessageReceivedAsync(message); } await handler.OnDisconnectedAsync(null); } return View(); } 客户端代码:在客户端使用 JavaScript 建立 WebSocket 连接。
<!DOCTYPE html> <html> <head> <title>WebSocket Example</title> </head> <body> <input type="text" id="userId" placeholder="Enter your ID"> <script> const userId = document.getElementById("userId").value; const socket = new WebSocket("ws://localhost:5000/ws"); socket.addEventListener("open", (event) => { socket.send(JSON.stringify({ userId })); }); socket.addEventListener("message", (event) => { const data = JSON.parse(event.data); console.log(`Server says: ${data}`); }); socket.addEventListener("close", (event) => { console.log(`Disconnected: ${event}`); }); </script> </body> </html> 这些技巧可以帮助你更好地使用 ASP.NET Core WebSocket 进行实时通信。