【发布时间】:2013-06-14 20:54:12
【问题描述】:
我很难解决这个问题。我也很难将它从一个应用程序持续复制到另一个应用程序。
在某些我似乎无法识别的情况下,使用HttpClient 进行PUT 和POST 调用会导致以下异常。
发送请求时出错。
内部异常:
底层连接已关闭:发送时发生意外错误。内部异常:
无法对已完成的异步结果对象执行此操作。
一切似乎都适用于 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