介绍
在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。
步骤1.创建一个新的ASP.NET Core项目
首先,使用 Visual Studio 或命令行创建一个新的 ASP.NET Core 项目。您可以选择 ASP.NET Core Web 应用程序模板并选择空模板。
步骤 2. 安装 WebSocket NuGet 包
在您的项目中,您需要安装 Microsoft.AspNetCore.WebSockets NuGet 包,它提供 WebSocket 支持。
dotnet add package Microsoft.AspNetCore.WebSockets
步骤 3. 创建 WebSocket 中间件
在 Startup.cs 文件中,在 Configure 方法中配置 WebSocket 中间件。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using WebSocketChatApp.Middleware;
Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp
{
public class Startup
{
// ... other configurations ...
public void ConfigureServices(IServiceCollection services)
{
// ... other services ...
services.AddWebSocketManager();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... other middleware ...
app.UseWebSockets();
app.MapWebSocketManager("/chat", app.ApplicationServices.GetService<ChatWebSocketHandler>());
// ... other configurations ...
}
}
}
步骤 4. 创建 WebSocket 处理程序
创建 WebSocket 处理程序类来管理 WebSocket 连接和消息。您可以将其命名为 ChatWebSocketHandler.cs。
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Middleware
{
public class ChatWebSocketHandler
{
private readonly WebSocketConnectionManager _connectionManager;
private readonly ILogger<ChatWebSocketHandler> _logger;
public ChatWebSocketHandler(WebSocketConnectionManager connectionManager, ILogger<ChatWebSocketHandler> logger)
{
_connectionManager = connectionManager;
_logger = logger;
}
public async Task HandleWebSocket(HttpContext context, WebSocket webSocket)
{
var socketId = _connectionManager.AddSocket(webSocket);
_logger.LogInformation($"WebSocket connection established with ID {socketId}");
while (webSocket.State == WebSocketState.Open)
{
var message = await ReceiveMessageAsync(webSocket);
if (message != null)
{
_logger.LogInformation($"Received message from ID {socketId}: {message}");
await BroadcastMessageAsync(message);
}
}
_connectionManager.RemoveSocket(socketId);
_logger.LogInformation($"WebSocket connection closed with ID {socketId}");
}
private async Task<string?> ReceiveMessageAsync(WebSocket webSocket)
{
var buffer = new byte[1024];
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.CloseStatus.HasValue)
{
return null;
}
return System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
}
private async Task BroadcastMessageAsync(string message)
{
foreach (var socket in _connectionManager.GetAllSockets())
{
if (socket.Value.State == WebSocketState.Open)
{
await socket.Value.SendAsync(System.Text.Encoding.UTF8.GetBytes(message), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
}
}
步骤 5. 创建 WebSocket 连接管理器
创建 WebSocket 连接管理器来跟踪连接的 WebSocket 客户端。您可以将其命名为 WebSocketConnectionManager.cs。
using System;
using System.Collections.Concurrent;
using System.Net.WebSockets;
Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Middleware
{
public class WebSocketConnectionManager
{
private readonly ConcurrentDictionary<Guid, WebSocket> _sockets = new ConcurrentDictionary<Guid, WebSocket>();
public WebSocket AddSocket(WebSocket socket)
{
var socketId = Guid.NewGuid();
_sockets.TryAdd(socketId, socket);
return socketId;
}
public WebSocket? GetSocket(Guid socketId)
{
_sockets.TryGetValue(socketId, out var socket);
return socket;
}
public ConcurrentDictionary<Guid, WebSocket>.ValueCollection GetAllSockets()
{
return _sockets.Values;
}
public Guid? GetSocketId(WebSocket socket)
{
foreach (var (key, value) in _sockets)
{
if (value == socket)
{
return key;
}
}
return null;
}
public void RemoveSocket(Guid socketId)
{
_sockets.TryRemove(socketId, out _);
}
}
}
步骤 6. 创建 WebSocket 端点
在控制器中创建一个 WebSocket 端点来处理 WebSocket 连接。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net.WebSockets;
using System.Threading.Tasks;
using WebSocketChatApp.Middleware;
Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Controllers
{
[Route("api/[controller]")]
public class ChatController : ControllerBase
{
private readonly ChatWebSocketHandler _webSocketHandler;
public ChatController(ChatWebSocketHandler webSocketHandler)
{
_webSocketHandler = webSocketHandler;
}
[HttpGet]
public async Task<IActionResult> Get()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await _webSocketHandler.HandleWebSocket(HttpContext, webSocket);
}
else
{
return BadRequest("WebSocket is not supported.");
}
return Ok();
}
}
}
步骤 7. 创建客户端应用程序
使用 JavaScript 创建一个简单的 HTML 页面来连接到 WebSocket 服务器并发送/接收消息。这是一个基本示例:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat By Sardar Mudassar Ali Khan</title>
</head>
<body>
<input type="text" id="messageInput" placeholder="Enter your message" />
<button οnclick="sendMessage()">Send</button>
<div id="chat"></div>
<script>
const socket = new WebSocket("ws://localhost:5000/api/chat");
socket.onopen = (event) => {
console.log("WebSocket connection established.");
};
socket.onmessage = (event) => {
const chatDiv = document.getElementById("chat");
chatDiv.innerHTML += `<p>${event.data}</p>`;
};
socket.onclose = (event) => {
if (event.wasClean) {
console.log(`WebSocket connection closed cleanly, code={event.code}, reason={event.reason}`);
} else {
console.error(`WebSocket connection died`);
}
};
function sendMessage() {
const messageInput = document.getElementById("messageInput");
const message = messageInput.value;
socket.send(message);
messageInput.value = "";
}
</script>
</body>
</html>
步骤 8. 运行应用程序
构建并运行您的 ASP.NET Core 应用程序。在浏览器中访问 WebSocket 聊天页面。您应该能够实时发送和接收消息。
此示例提供了 ASP.NET Core 中 WebSocket 聊天应用程序的基本实现。您可以根据需要扩展和自定义它。
结论
此示例提供了使用 WebSocket 在 ASP.NET Core 中进行实时通信的基础结构。您可以在此基础上进行扩展,通过添加身份验证、用户管理和消息持久性等功能来创建更复杂的实时应用程序,例如聊天室、通知或协作编辑工具。