HttpClient https请求使用主机名失败,但是可以使用IP地址工作

时间:2018-11-16 12:52:25

标签: c# https dotnet-httpclient

一般来说,我是Web知识的新手。不知道这里是什么问题。

我有一台带有IIS的机器,该机器在https上运行ASP NET Core REST API。 通过执行以下任一操作,我可以确认GET是否可以通过我的计算机上的Google Chrome正常工作

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

我有以下代码。

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,我已经在IPAddress[]返回的GetHostAddresses中看到了它。为什么HttpClient不解析IP-还是解析IP另一个问题?

我尝试过

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

但这没什么区别。使用

ServicePointManager.ServerCertificateValidationCallback

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

我怀疑问题是因为我不熟悉这些东西,所以错过了某处重要的东西。

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

1 个答案:

答案 0 :(得分:0)

我完全看错地方了。问题出在IIS安装程序上。

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

我可能超出了我的理解范围,可能是错误的,但是我怀疑这是因为Wireshark认为,对MDNS请求以查找主机名IP的响应正在返回 ipv6 地址”,当然不是10.0.0.21。再说一次,我可能是错的。

我不确定的原因是,当我放入https://test-machine/api/Example时,chrome似乎已经完全犁开并找到了正确的东西,而我无法解释原因。