【问题标题】:HttpClient https request fails using hostname, but works using IP addressHttpClient https 请求使用主机名失败,但使用 IP 地址工作
【发布时间】:2018-11-16 12:52:25
【问题描述】:

一般来说,我是网络新手。不知道这里有什么问题。

我有一台带有 IIS 的机器,在 https 上运行 ASP NET Core REST API。 我可以通过执行以下任一操作来确认 GET 在我的机器上通过 Google Chrome 运行

我确认 POST 操作正在使用 Postman(再次忽略无效证书)。 在我尝试编写客户端应用程序之前,一切都很好。

我有以下代码。

var ip = Dns.GetHostAddresses("test-machine");
// ip contains the correct IP 

using (var hc = new HttpClient())
{
    hc.GetAsync(@"https://test-machine/api/Example").Wait();
}

此代码失败。我得到一个 System.AggregateException:“发生了一个或多个错误。”有 4 个例外叠加在一起。

  1. HttpRequestException:发送请求时出错。
  2. WebException:底层连接已关闭:发送时发生意外错误。
  3. IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。
  4. SocketException:现有连接被远程主机强行关闭

如果我将代码更改为使用 IP:

using (var hc = new HttpClient())
{
    hc.GetAsync(@"https://10.0.0.21/api/Example").Wait();
}

然后请求按预期工作,即与 Chrome 一样,我遇到了证书问题:

AuthenticationException:根据验证程序,远程证书无效。

我做错了什么? Dns 显然能够获得正确的 IP,我在 GetHostAddresses 返回的 IPAddress[] 中看到了它。为什么 HttpClient 没有解析 IP - 或者它正在解决另一个问题的 IP?

我试过了

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

但这没有区别。使用

ServicePointManager.ServerCertificateValidationCallback

也不起作用,因为它永远不会到达调用回调的地步。在那之前就失败了。

我怀疑问题是因为我不熟悉这些东西,所以我在某个地方遗漏了一些重要的东西。

我还要注意 - 这是一个 .net 4.5.2 控制台应用程序。我尝试迁移到 4.6.1,但仍然失败。

【问题讨论】:

标签: c# https dotnet-httpclient


【解决方案1】:

我完全看错地方了。问题在于 IIS 设置。

站点绑定由于某种原因被明确设置为 10.0.0.21:433。将其切换为“所有未分配” - 似乎已经完成了这项工作。

我可能超出了我的深度,并且可能是错误的,但我怀疑其原因是根据 Wireshark 的说法,对查找主机名 IP 的 MDNS 请求的响应返回的是 ipv6 服务器机器的地址,当然不是 10.0.0.21。再说一次,我可能是错的。

我如此不确定的原因是,当我输入 https://test-machine/api/Example 时,chrome 似乎已经通过并找到了正确的东西,我无法解释原因。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多