Ada*_*dam 10 .net ssl httpclient async-await asp.net-web-api
我在解决这个问题上遇到了很糟糕的时间.我也有一个糟糕的时间从一个应用程序到另一个应用程序一致地再现它.
在某些情况下,我似乎无法识别,在以下异常中使用结果进行调用PUT和POST调用HttpClient.
发送请求时发生错误.
内部异常:
基础连接已关闭:发送时发生意外错误.内部异常:
无法对已完成的异步结果对象执行此操作.
一切似乎都适用于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...
Run Code Online (Sandbox Code Playgroud)
更新:
如果我脱掉ConfigureAwait(false)它工作正常.
注意,这是一个WPF应用程序,具体来说,这是一个Visual Studio扩展.但是,我确实有一个ASP.NET MVC 4应用程序具有完全相同的问题,并且该应用程序根本不会调用ConfigureAwait(false)...
更新2:
我更新了代码片段以包含HttpClient类的实例化.代码片段中唯一未包含的是模型类型和声明.它应该是无关紧要的,因为它是一个具有所有自动属性且没有复杂类型的可序列化类.
更新3:
我不知道这是否相关,但我发现了一些对我来说很奇怪的事情.
在执行上面的代码时,在Fiddler中,我得到一个401on 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");
Run Code Online (Sandbox Code Playgroud)
现在它失败了,但是当我打开Fiddler并让它解密流量时......它有效!
更新5:
我认为这必须是服务器问题或证书问题.任何有关如何从这里检查的提示将不胜感激.证书有效并从受信任的CA颁发.
更新6:
更多调试和故障排除.在ServicePointManager CertificateValidationCallback调用之前发生异常.
小智 2
我刚刚解决了 HttpClient 的类似问题。事实证明,我在 SSL 握手期间收到了 SNI 警告,这导致 HttpClient 无限期锁定。尝试运行 WireShark/tcpdump 并查看是否收到 TLSv1 无法识别的名称警告或任何其他类型的握手警告。根据我的测试,HttpClient 似乎无法正确处理这些问题。
| 归档时间: |
|
| 查看次数: |
2381 次 |
| 最近记录: |