【发布时间】:2022-01-03 05:31:02
【问题描述】:
我有一个启动基本 SignalR 集线器的 .NET5.0 独立服务(作为 Windows 服务安装)。它使用 Http.Sys 内部有一些其他 API 控制器,我目前正在使用 HubConnection 从 WinForms 客户端连接到它。
它在我的开发机器上完美运行,但是当我将它移动到 Azure VM(服务器 2019 数据中心)时,来自客户端的第一个 WebSocket 调用会挂起一段时间,然后失败。从那时起,它似乎“工作”了,但非常非常缓慢(太慢而无法使用)。
我已经在 Azure 服务器和 Azure 门户中打开了相应的传入和传出端口。
如果我在同一虚拟网络中的不同天蓝色 VM 上运行我的 Winforms 客户端,则一切正常。因此,我确信服务器工作正常,只有当我通过互联网进入时它才会失败。
当我尝试外部连接时,服务器日志文件显示:
2021-11-24 17:10:19.6884|1|调试|Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher|已接收 集线器调用:InvocationMessage { InvocationId:“1”,目标: “GetAllState”,参数:[],StreamIds:[]}。 17:10:31.1564|4|调试|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|等待 让应用程序完成发送数据。 2021-11-24 17:10:31.1564|12|调试|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|错误 书写框架。 System.Threading.Tasks.TaskCanceledException:一个任务 取消了。在 System.Net.WebSockets.ManagedWebSocket.SendFrameFallbackAsync(MessageOpcode 操作码,布尔 endOfMessage,ReadOnlyMemory
1 payloadBuffer, CancellationToken cancellationToken) at System.Net.WebSockets.WebSocketExtensions.SendMultiSegmentAsync(WebSocket webSocket, ReadOnlySequence1 缓冲区,WebSocketMessageType webSocketMessageType, CancellationToken cancelToken) 在 Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsServerTransport.StartSending(WebSocket 插座) 2021-11-24 17:10:31.1564|2|调试|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|Socket 关闭。客户端显示:
2021-11-24 18:55:43.4679|50|ERROR|Microsoft.AspNetCore.SignalR.Client.HubConnection|服务器连接因错误而终止。 System.Net.WebSockets.WebSocketException (0x80004005):远程 一方在未完成关闭的情况下关闭了 WebSocket 连接 握手。 ---> System.IO.IOException: 无法从 传输连接:现有连接被强行关闭 远程主机.. ---> System.Net.Sockets.SocketException (10054): An 现有连接被远程主机强行关闭。
我查看了很多试图解决此问题的文章,但找不到任何相关内容。它必须与配置相关,并且必须处于“azure 门户”级别,因为该服务跨 LAN 工作。有谁知道我需要做什么才能让它运行?
更新:
我在新的自定义端口上使用 TcpListener 和 TcpClient 创建了几个控制台应用程序,在我的 Azure VM 上运行服务器应用程序,通过 Internet 成功连接到它,并在两者之间传递消息。非常困惑为什么 WebSocket 无法通过 Internet 工作。
更新2:
我将服务更改为使用 Kestrel,现在它可以按预期工作。因此,无论出于何种原因,它都拒绝使用 Http.Sys 在互联网上工作。我只使用 Http.Sys 为其他一些不会使用此服务的客户端进行基本身份验证,因此 Kestrel 可以正常工作。
【问题讨论】:
-
天蓝色环境有防火墙吗?网关?负载均衡器? WAF?与您的本地主机环境有什么不同?
-
据我所知,没有。除了必须打开自定义端口号。服务上的 api 控制器在外部工作正常(这些只是 https/json),所以我可以毫无问题地向服务发出请求。它只是在与 websocket 斗争。
-
根据这个问题,我建议你可以先查看事件查看器,看看请求切换到socket时发生了什么。
标签: c# azure asp.net-core websocket signalr