【发布时间】:2019-12-04 01:57:24
【问题描述】:
我正在尝试在 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.cs 的ConfigureServices 方法:
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");
});
}
我的WebSocketHandler 的OnConnectedAsync 方法如下:
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
如果我在OnConnectedAsync 方法的末尾放置一个Task.Delay(-1),它会保持连接打开但会丢弃传入的连接。
我搜索了 MSDocs,但找不到太多关于如何使用 MapConnectionHandler<T> 的文档。
有一个while循环来接收来自OnConnectedAsync中多个客户端的消息对我来说安全吗?
这不是处理 websocket 连接的正确方法吗?
MapConnectionHandler<T> 是瞬态的吗?
我真的很困惑,无法弄清楚它的行为。
【问题讨论】:
-
这可能是你的问题。 "docs.microsoft.com/en-us/aspnet/core/fundamentals/…" 使用 WebSocket 时,必须在连接期间保持中间件管道运行。从您的日志中,它看起来好像在连接后立即关闭了 Web 套接字。一旦端点被接受,就可以看到它处理
-
如果你把这个放在 await Echo(context, webSocket);接受网络套接字后。 add 从链接添加回显代码
标签: c# asp.net-core .net-core websocket