【问题标题】:.NET 4.5 HttpClient PUT or POST over SSL always fails.NET 4.5 HttpClient PUT 或 POST over SSL 总是失败
【发布时间】:2013-06-14 20:54:12
【问题描述】:

我很难解决这个问题。我也很难将它从一个应用程序持续复制到另一个应用程序。

在某些我似乎无法识别的情况下,使用HttpClient 进行PUTPOST 调用会导致以下异常。

发送请求时出错。

内部异常:
底层连接已关闭:发送时发生意外错误。

内部异常:
无法对已完成的异步结果对象执行此操作。

一切似乎都适用于 HTTP,这只发生在 HTTPS 上。

证书有效,但我尝试设置ServicePointManager.ServerCertificateValidationCallback += (s, c, ch, es) => true;

我试过设置client.DefaultRequestHeaders.ExpectContinue = false;

我试过了,看起来像一百万,其他的东西,从标头、身份验证等。

有人知道我还能检查、尝试什么等吗?

代码sn-p:

// this is my registration in my IoC container...
var handler = new HttpClientHandler
{
    UseDefaultCredentials = true,
    Credentials = CredentialCache.DefaultNetworkCredentials,
};

var client = HttpClientFactory.Create(handler);
client.BaseAddress = new Uri(Properties.Settings.Default.BaseUrl);
client.DefaultRequestHeaders.Add("X-CustomHeader", "value");

// _client is constructor injected into my class...
var response = await _client.PutAsJsonAsync("api/resource/" + id, model).ConfigureAwait(false);
response.EnsureSuccessStatusCode(); // <-- never executes...

更新:

如果我取下ConfigureAwait(false),它就可以正常工作。

注意,这是一个 WPF 应用程序,具体来说,这是一个 Visual Studio 扩展。但是,我确实有一个 ASP.NET MVC 4 应用程序存在完全相同的问题,并且该应用程序根本不调用 ConfigureAwait(false)...

更新 2:

我更新了代码 sn-p 以包含 HttpClient 类的实例化。唯一没有包含在代码 sn-p 中的是模型类型和声明。它应该是无关紧要的,因为它是一个具有所有自动属性且没有复杂类型的可序列化类。

更新 3:

我不知道这是否相关,但我发现了一些对我来说很奇怪的东西。

执行上述代码时,在 Fiddler 中,我在 POST 上得到一个 401,然后是 2 个 CONNECT,这会导致以下 HTTP 响应:

HTTP/1.1 200 连接已建立
连接:关闭

更新 4:

我将 IoC 注册码更改为:

var handler = new HttpClientHandler
{
    UseDefaultCredentials = true,
    Credentials = CredentialCache.DefaultCredentials,
};

var client = HttpClientFactory.Create(handler);
client.BaseAddress = new Uri(Properties.Settings.Default.BaseUrl);
client.DefaultRequestHeaders.Add("X-CustomHeader", "value");

现在它失败了,但是当我打开 Fiddler 并让它解密流量时......它可以工作了!

更新 5:

我认为这一定是服务器问题或证书问题。任何关于从这里检查什么的提示将不胜感激。证书是有效的,由受信任的 CA 颁发。

更新 6:

更多调试和故障排除。在调用ServicePointManager CertificateValidationCallback 之前发生异常。

【问题讨论】:

  • 显示实际发送代码的摘录。
  • 添加了代码sn-p,但实际上只是基本用法。没什么特别的。
  • 您是否在请求完成之前处理_client?你能发布一个最小的复制吗?
  • @StephenCleary 不,不处理它。在我的应用程序的整个生命周期中使用相同的实例。添加了更多代码的更新,但它确实是一个非常简单的使用。
  • 有类似的问题。我删除了等待,只是为了看看呼叫是否触发。当等待不存在时它会这样做。当等待存在时不会触发。永远不要离开服务器。

标签: .net ssl asp.net-web-api httpclient async-await


【解决方案1】:

我刚刚解决了与 HttpClient 类似的问题。事实证明,我在 SSL 握手期间收到了 SNI 警告,这导致 HttpClient 无限期锁定。尝试运行 WireShark/tcpdump 并查看是否收到 TLSv1 Unrecognized Name 警告或任何其他类型的握手警告。根据我的测试,HttpClient 似乎无法正确处理这些问题。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我通过安装最新更新的 .NET 框架 (4.5) 解决了它。

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多