每 30 个连接中就有 1 个出现 Win32Exception: Unknown location 错误。 Azure Web 应用到 AWS SQL 数据库

Every 1 in 30 connections I get Win32Exception: Unknown location error. Azure web app to AWS SQL DB

我们有几个 .NET Core 3.0 Web 应用程序(英国南部)连接到 MS SQL 2016 数据库,该数据库位于 运行 Amazon Windows Server 2016 数据中心(EC2 实例)。我们通过安装在 SQL 服务器上的 Azure Relay/Hybrid 连接进行连接。

一年多来一直运行良好,没有任何错误,但最近我们开始出现以下错误,每 30 个连接中大约有 1 个:

An unhandled exception occurred while processing the request. Win32Exception: An existing connection was forcibly closed by the remote host. Unknown location

SqlException: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

如果您再试一次,通常会成功。

在阅读了很多关于此的帖子后,我使用 EnableRetryOnFailure() 向 code/resilience 添加了暂时性错误处理到数据库连接。

我还尝试将 Trusted_Connection=False 添加到连接字符串中。

在此之后,您会看到连接重试多次直到成功,有时需要 20 秒或更长时间。不过,也许 100 个连接中有 1 个最终会因相同的错误而失败。

我们还查看了 TLS_DHE 错误 https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/apps-forcibly-closed-tls-connection-errors,但服务器上根本没有安装 TLS_DHE 密码。

Windows 服务器上的事件日志或发生错误时的数据库日志中没有任何内容。

基础设施的最新变化:Panda 杀毒软件,将网络应用程序移动到不同的 Azure 区域。

几天来我一直在阅读这方面的帖子,大部分内容都非常陈旧且略有不同。我正在寻找任何想法来尝试查明错误。谢谢

编辑:我在 Microsoft/ServiceBus/Client

中找到了一些事件日志

HybridConnectionManager Trace: Microsoft.Azure.Relay.RelayException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.WebSockets.WebSocketException: An internal WebSocket error occurred. Please see the innerException, if present, for more details. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) --- End of inner exception stack trace ---

好吧,这花了三个月的时间才解决,它涉及到我们的网络支持团队、AWS 支持和 Azure 支持。

我已经回来三次编辑这个答案了。该解决方案在另一台服务器上返回,因此我们尝试了在一台服务器上有效的修复程序,但它们不起作用!

在 Azure Relay/Hyrbid 连接中,在有问题的连接下,我们看到有两个侦听器,而应该只有一个。您安装和连接的每个混合连接管理器都显示为侦听器。

那么第二个听众在哪里?无处。它似乎是来自先前删除的连接的挂起的孤儿 link。

删除幻听的唯一方法是

  • 在数据库服务器上卸载 HCM
  • 从所有使用它的 Azure 应用中删除连接
  • 在azure中完全删除混合连接
  • 重新在 Azure 中重新创建连接
  • 重新连接应用程序
  • 在数据库服务器上重新安装 HCM
  • 将 HCM 连接到新的混合连接

在此之后,我们在 Azure 中的连接下显示了一个侦听器,一切立即生效。

当你有两个监听器时,数据在它们之间进行负载平衡,所以在我的例子中,有一半时间数据被路由到一个不存在的监听器并且失败了。这就是为什么没有日志出现在数据库服务器上的原因 - 它根本没有到达那里!