【问题标题】:DLL creating a connection fails with "An existing connection was forcibly closed by the remote host"DLL 创建连接失败并显示“现有连接已被远程主机强制关闭”
【发布时间】:2020-04-28 18:22:31
【问题描述】:

我创建了一个 DLL [作为 NuGet 包 (.NetStandard 2.0/2.1) 提供]。

当此 DLL 中的特定类被实例化时,我们会触发一个同步 GET 调用,以加载一些配置数据。

此 DLL 使用单例 HttpClient(我们在此处遵循 Microsoft 的“最佳实践”)

Factory.SingletonHttpClient().GetAsync(args.Uri).GetAwaiter().GetResult();

我已经在一系列应用程序中使用了这个 NuGet 包,所有应用程序都是使用 .Net Framework 4.7.2 构建的,它们工作得很好 - 数据已成功从 WebAPI 中检索到。

但是....我有一个特定的应用程序(同样是 4.7.2),其中 GET 始终失败并显示错误消息:

System.Net.Sockets.SocketException HResult=0x80004005 消息=An 现有连接被远程主机强行关闭

此异常最初是在此调用堆栈中引发的: System.Net.Sockets.Socket.BeginReceive(byte[], int, int, System.Net.Sockets.SocketFlags, System.AsyncCallback, object)

所以这必须是特定于我的使用此 NuGet 包的应用程序的东西,因为它适用于所有其他消费应用程序。但是,我看不出如何找出问题所在。

【问题讨论】:

    标签: sockets asp.net-web-api httpclient dotnet-httpclient socketexception


    【解决方案1】:

    所以我找到了答案,但我对此感到困惑。

    我使用的是最新版本的 Windows 10(版本 1909)。 我所有的应用程序都在使用 .Net 4.7.2

    所以当我在我的机器上调试所有这些 .NET 4.7.2 应用程序时,它们都会调用我的 IIS LocalHost 上的 WebAPI,除了这个应用程序。

    当我查看这个失败的应用程序中的ServicePointManager.SecurityProtocol 时,我发现它正在使用SSLTLS 的过时值运行。为什么此应用程序会出现这种情况,而其他应用程序则不会?任何地方都没有规定使用这些过时的协议,那么为什么要使用它们而不是其他应用程序呢?

    我通过修改我的 NuGet DLL 以将 TLS1.2 添加到正在使用的任何 TLS 版本来解决此问题:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | ServicePointManager.SecurityProtocol;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 2021-05-12
      相关资源
      最近更新 更多