简单的 HTTP GET 会导致 "An existing connection was forcibly closed by the remote host" 但仅在具有 ClickOnce 的 WPF 中?

Simple HTTP GET leads to "An existing connection was forcibly closed by the remote host" but only in WPF with ClickOnce?

我正试图为一个非常奇怪的运行ge 行为找到解释。

代码比较简单:

// A simple HTTP GET call with RestSharp.
var url = "https://sandbox.tradier.com/v1/markets/quotes?symbols=MSFT";
var bearerToken = "thisCouldBeYourToken";
var client = new RestClient(url);
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", $"Bearer {bearerToken}");

var response = await client.ExecuteTaskAsync<MyClass>(request)

该代码是使用 ClickOnce 部署的 .NET 4.7.2 WPF 应用程序的一部分。

几天前,没有任何变化,这个电话突然返回An existing connection was forcibly closed by the remote host。但是仅针对此特定 URL。我对其他 URL 也使用完全相同的代码,没有任何问题。

真正的问题是运行ge,当我调试应用程序时没有发生异常,而是收到了所需的响应。即使我在没有 debuggung 的情况下启动应用程序,也没有错误。我重新部署了应用程序,但仍然出现错误。所以出于某种原因,调用在部署后会有所不同!?顺便说一句:部署的版本也在我的电脑上 运行ning,而不是其他地方。

经过一些密集的谷歌搜索后,我遇到了 this post,它建议将 SecurityProtocol 显式设置为 TLS 1.2(默认值:SystemDefault):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

它就像一个魅力。现在部署的版本 运行ning 也没有任何问题。所以我猜 URL 现在需要 TLS 1.2,好吧。但是,为什么应用程序 运行 甚至在直接启动之前 运行 通过 ClickOnce 部署时就出现问题?

我没有验证过,但好像是 KB4520405 (KB4519565) changes ClickOnce application from TLS 1.2 to 1.0 .

因此,通过 ClickOnce,它开始默认启动旧的 TLS 版本。