在 Azure Windows VM 上托管服务时,无法将 websocket 与 SignalR 配合使用 (C#/.NET5.0)



我有一个.NET5.0独立服务(作为windows服务安装(,它启动一个基本的SignalR集线器。它使用Http.Sys内部有一些其他API控制器,我目前正在使用HubConnection从WinForms客户端连接到它。

它在我的开发机器上运行得很好,但当我将它移到Azure VM(服务器2019数据中心(时,来自客户端的第一个WebSocket调用会挂起一段时间,然后失败。然后它似乎";工作;从那时起,但非常、非常慢(太慢,无法使用(。

我已经在Azure服务器和Azure门户中打开了相应的传入和传出端口。

如果我在同一个虚拟网络中的另一个azure虚拟机上运行我的Winforms客户端,一切都很好。因此,我确信服务器工作正常,只有当我通过互联网进入时才会出现故障。

当我尝试外部连接时,服务器日志文件显示如下:

2021-11-2417:10:19.6884|1|DEBUG|Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher|已接收集线器调用:InvocationMessage{InvocationId:"1",目标:"GetAllState";,参数:[],StreamIds:[]}。17:10:31.1564|4|DEBUG|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|正在等待以便应用程序完成发送数据。2021-11-2417:10:31.1564|12|DEBUG|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|错误书写框架。System.Threading.Tasks.TaskCanceledException:任务已取消。在System.Net.Webockets.ManagedWebSocket.SendFrameFallbackAsync(MessageOpcode操作码,Boolean endOfMessage,ReadOnlyMemory1 payloadBuffer, CancellationToken cancellationToken) at System.Net.WebSockets.WebSocketExtensions.SendMultiSegmentAsync(WebSocket webSocket, ReadOnlySequence1缓冲区,WebSocketMessage类型webSocketMessageType,CancellationToken CancellationToken(Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsServerTransport.StartSending(WebSocket插座(2021-11-2417:10:31.1564|2|DEBUG|Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport|Socket关闭

客户端显示:

2021-11-2418:55:43.4679|50|错误|Microsoft.AspNetCore.SignalR.Client.HubConnection|服务器连接因错误而终止。System.Net.WebSockets.WebSocketException(0x80004005(:远程参与方在未完成关闭的情况下关闭了WebSocket连接握手--->System.IO.IOException:无法从传输连接:现有连接被强制关闭远程主机--->System.Net.Sockets.SocketException(10054(:远程主机已强制关闭现有连接。

我看了很多文章试图解决这个问题,但我找不到任何相关的东西。它必须与配置相关,并且必须位于";azure门户";级别,因为该服务在局域网上工作。有人知道我需要做什么才能让这一切顺利进行吗?

更新:

我在一个新的自定义端口上使用TcpListener和TcpClient创建了几个控制台应用程序,在我的Azure虚拟机上运行服务器应用程序,通过互联网成功连接到它,并在两者之间传递消息。很困惑为什么WebSocket不能在互联网上工作。

更新2:

我将服务更改为使用Kestrel,现在它可以正常工作了。因此,无论出于何种原因,它都拒绝使用Http.Sys在互联网上工作。我只是使用Http.Sys为其他一些不会使用该服务的客户端提供基本身份验证,所以Kestrel会正常工作。

我将服务更改为使用Kestrel,现在它可以按预期工作了。因此,无论出于何种原因,它都拒绝使用Http.Sys.在互联网上工作

最新更新