.NET 4.5 HttpClient PUT或SSL over POST总是失败

时间:2013-06-14 20:54:13

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

我正在解决这个问题。我也有一段糟糕的时间从一个应用程序到另一个应用程序不断地再现它。

在某些我无法识别的情况下,使用PUT拨打POSTHttpClient会导致以下异常。

  

发送请求时发生错误。

     

内部例外:
  基础连接已关闭:发送时发生意外错误。

     

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

所有内容似乎都适用于HTTP,这只发生在HTTPS上。

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

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

我已经尝试了,看起来像一百万,其他东西,包括标题,身份验证等。

有谁知道我还能检查什么,尝试等等?

代码段:

// 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:

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

更新3:

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

执行上面的代码时,在Fiddler中,我在401上得到POST,然后是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之前。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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