在.NET 8中,使用WebSocket进行实时通信是一种高效的方式,尤其适用于需要实时数据交换的应用场景,比如聊天应用、在线游戏、股票行情推送等。WebSocket是一种持久连接的协议,可以在客户端和服务器之间进行双向通信。接下来,我们将通过一个简单的示例来展示如何在.NET 8 Web API中实现WebSocket通信。
环境准备
确保您已安装.NET 8 SDK。如果还没有,可以前往官方页面下载并安装。另外,您可以使用Visual Studio或Visual Studio Code进行开发。
创建项目
首先,我们需要创建一个新的Web API项目。在命令行中运行以下命令:
dotnet new webapi -n WebSocketDemo
cd WebSocketDemo
修改启动配置
打开Program.cs
文件,我们将在其中配置WebSocket支持。代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// 添加服务
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
var app = builder.Build();
// 启用CORS
app.UseCors("AllowAll");
// WebSocket中间件
app.UseWebSockets();
app.MapGet("/", () => "WebSocket Demo");
app.Map("/ws", async (HttpContext context) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
await Echo(webSocket);
}
else
{
context.Response.StatusCode = 400;
}
});
// 回声示例方法
async Task Echo(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
// 将接收到的消息发送回去
var echoMessage = $"你发送的消息是:{message}";
var byteMessage = System.Text.Encoding.UTF8.GetBytes(echoMessage);
await webSocket.SendAsync(new ArraySegment<byte>(byteMessage), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
app.Run();
代码解析
-
CORS设置:通过添加CORS策略
AllowAll
,允许所有来源的请求。这样可以在本地开发时避免跨域问题。 -
WebSocket中间件:使用
app.UseWebSockets()
来启用WebSocket中间件。 -
WebSocket端点:我们在
app.Map("/ws", ...)
中定义了一个WebSocket的端点。当客户端连接到/ws
时,我们接受这个WebSocket连接。 -
回声逻辑:
Echo
方法实现了一个简单的回声功能,即将客户连接发送的消息原封不动地返回给客户端。它会持续接收消息,直到WebSocket关闭。
客户端实现
为了测试这个WebSocket服务,我们可以使用JavaScript编写一个简单的客户端。在wwwroot
文件夹中创建一个index.html
文件,内容如下:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Demo</title>
</head>
<body>
<h1>WebSocket Demo</h1>
<input type="text" id="message" placeholder="输入消息" />
<button onclick="sendMessage()">发送</button>
<div id="output"></div>
<script>
const socket = new WebSocket('ws://localhost:5000/ws');
socket.onmessage = function(event) {
const output = document.getElementById('output');
output.innerHTML += `<p>${event.data}</p>`;
};
function sendMessage() {
const input = document.getElementById('message');
const message = input.value;
socket.send(message);
input.value = ''; // 清空输入框
}
</script>
</body>
</html>
测试
- 在项目目录下运行应用程序:
bash
dotnet run
-
打开浏览器,访问
http://localhost:5000/index.html
(确保静态文件服务正常)。 -
在输入框中输入消息并点击“发送”按钮,您将看到服务端返回的消息在页面上显示。
总结
使用.NET 8实现WebSocket通信非常简单。通过上述例子,我们展示了如何创建一个WebSocket服务,并与客户端进行双向通信。您可以基于这个基础,扩展出更复杂的实时应用。