DLL创建连接失败,"现有连接被远程主机强行关闭"

问题描述 投票:0回答:1

我已经创建了一个DLL[作为NuGet包(.NetStandard 2.02.1)提供]。

当这个DLL中的一个特定类被实例化时,我们向安装在我的本地机器(localhost)IIS上的一个.Net Core WebAPI发出一个同步的GET调用,以加载一些配置数据。

这个DLL使用了一个单例的HttpClient(我们在这里遵循了微软的 "最佳实践")。

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

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

然而......我有一个特殊的应用程序(同样是4.7.2),GET一直失败,并出现错误信息。

System.Net.Sockets.SocketException HResult=0x80004005 Message=一个现有的连接被远程主机强行关闭。

这个异常最初是在这个调用栈抛出的。 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个回答
0
投票

所以我找到了答案,但我被它搞糊涂了。

我使用最新版本的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;
© www.soinside.com 2019 - 2024. All rights reserved.