gpt4 book ai didi

c# - ASP.NET 核心 WebSocket

转载 作者:行者123 更新时间:2023-11-30 22:51:27 25 4
gpt4 key购买 nike

我正在尝试在 ASP.NET Core 上启动并运行 WebSocket 服务器。我创建了一个空的 Web 项目 dotnet new web改变了 Program.cs到:

public static void Main(string[] args) {
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
})
.Build()
.Run();
}

Startup.csConfigureServices方法:

public void ConfigureServices(IServiceCollection services) {
services.AddControllers();
services.AddWebSockets();
}

Configure方法:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseWebSockets();
app.UseRouting();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
endpoints.MapConnectionHandler<WebSocketHandler>("/ws");
});
}

还有我的WebSocketHandlerOnConnectedAsync我有以下方法:

public override async Task OnConnectedAsync(ConnectionContext connection) 
{
var context = connection.GetHttpContext();
var endpoint = $"{connection.RemoteEndPoint}";

if (!context.WebSockets.IsWebSocketRequest) {
connection.Abort();
_logger.LogCritical($"Request from {endpoint} endpoint aborted.");
return;
}

var websocket = await context.WebSockets.AcceptWebSocketAsync();
_logger.LogInformation($"WebSocket request from {endpoint} endpoint accepted!");
}

当我尝试连接到 APP_URL/ws 时出现问题每次服务器一收到请求就关闭连接。以下是日志:https://pastebin.com/raw/34yu7thw

如果我放置一个 Task.Delay(-1)OnConnectedAsync 的末尾方法,它保持连接打开但丢弃传入连接。

我搜索了 MSDocs,但没能找到很多关于如何使用 MapConnectionHandler<T> 的文档。 .

OnConnectedAsync 中有一个从多个客户端接收消息的 while 循环对我来说是否安全? ?这不是处理 websocket 连接的正确方法吗?是MapConnectionHandler<T>短暂的?

我真的很困惑,无法弄清楚它的行为。

最佳答案

我已经使用这些文档在 ASP.NET Core 中实现了一个 WebSocket 服务器,它对我来说效果很好:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1

主要思想是,在您使用 AcceptWebSocketAsync() 接受请求后,您获取返回的 WebSocket 对象并使用它来发送和接收。通常,您会创建一个循环,调用 ReceiveAsync 直到满足某些条件(您确定 session 在收到特定消息时完成,或者客户端断开连接等)。正如文档所述,使用 WebSocket 时,您必须在连接期间保持中间件管道运行。 因此,如果您将 WebSocket 连接传递给执行发送/接收的后台工作人员,您需要在与该客户端交互期间保持该管道打开。然后当你完成时,你向中间件发出连接已完成并且可以解除连接的信号。

我怀疑没有保持连接打开和循环是你的问题。我之前没有为 WebSockets 使用过 MapConnectionHandler,所以这可能行不通,但上面的策略可能对你有帮助,或者按照这样的后台工作人员的文档:

app.Use(async (context, next) => {
var socket = await context.WebSockets.AcceptWebSocketAsync();
var socketFinishedTcs = new TaskCompletionSource<object>();

BackgroundSocketProcessor.AddSocket(socket, socketFinishedTcs);

await socketFinishedTcs.Task;
});

关于c# - ASP.NET 核心 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59167901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com