ASP.NET Core 中使用 WebSocket 协议进行实时通信

介绍

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 中进行实时通信的基础结构。您可以在此基础上进行扩展,通过添加身份验证、用户管理和消息持久性等功能来创建更复杂的实时应用程序,例如聊天室、通知或协作编辑工具。

相关推荐
时光追逐者7 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 46 期(2025年7.7-7.13)
c#·.net·.netcore
王柏龙8 小时前
aspnetcore Mvc配置选项中的ModelMetadataDetailsProviders
mvc·.netcore
码头薯条Pro19 小时前
Javaweb使用websocket,请先连上demo好吧!很简单的!
网络·websocket·网络协议
江沉晚呤时1 天前
在 C# 中调用 Python 脚本:实现跨语言功能集成
python·microsoft·c#·.net·.netcore·.net core
喵叔哟1 天前
3. 【Blazor全栈开发实战指南】--Blazor是什么?为什么选择Blazor?
c#·.netcore
超级无敌永恒暴龙战士2 天前
Java网络编程
java·websocket
斯~内克2 天前
WebSocket 重连与心跳机制:打造坚如磐石的实时连接
网络·websocket·网络协议
好记性不如2 天前
websocket
网络·websocket·网络协议
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 天前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
zhysunny5 天前
WebSocket实战:实现实时聊天应用 - 双向通信技术详解
网络·websocket·网络协议