C# 使用ClientCert->Client cert not sent时,HttpClient失败,System.ArgumentException异常
我在Windows Phone应用程序中使用Windows.Web.Http.HttpClient时遇到问题。我正在使用一个需要客户端证书的服务器。调用SendRequestAsync时,我得到一个System.ArgumentException:值不在预期范围内 我正在将ClientCertificate设置为通过HttpFilter对象使用 我在服务器上运行Wireshark,我能够通过服务器密钥解密流量。在Wireshark中,我看到一个TLSv1.2服务器Hello、Certificate、Certificate Request数据包,服务器请求一个由颁发我通过的证书的同一CA颁发的证书。在我看到证书请求数据包之后,我看到客户端发送了一个FIN,ACK数据包 注意,我有两个HTTPS请求。第一个是HTTP OPTIONS请求,对于该请求,我确实看到正在传递客户端证书,在这个请求上我确实得到了HTTP 200响应。当我使用HTTP POST执行第二个请求时,我得到了失败。两者都使用相同的代码路径将请求发送到服务器 关于如何让HttpClient使用证书,有什么想法吗 以下是我正在使用的代码:C# 使用ClientCert->Client cert not sent时,HttpClient失败,System.ArgumentException异常,c#,ssl,windows-phone-8.1,C#,Ssl,Windows Phone 8.1,我在Windows Phone应用程序中使用Windows.Web.Http.HttpClient时遇到问题。我正在使用一个需要客户端证书的服务器。调用SendRequestAsync时,我得到一个System.ArgumentException:值不在预期范围内 我正在将ClientCertificate设置为通过HttpFilter对象使用 我在服务器上运行Wireshark,我能够通过服务器密钥解密流量。在Wireshark中,我看到一个TLSv1.2服务器Hello、Certificat
IHttpFilter httpFilter = null;
HttpRequestMessage requestMsg = null;
HttpResponseMessage responseMessage = null;
HttpClient client = null;
try
{
httpFilter = new HttpBaseProtocolFilter();
httpFilter.AutomaticDecompression = true;
httpFilter.ClientCertificate = _MyCertificate;
httpFilter.AllowAutoRedirect = true;
client = new HttpClient(httpFilter);
requestMsg = new HttpRequestMessage();
requestMsg.RequestUri = _Uri;
requestMsg.Method = _HttpMethod;
if (_PostData != null && _PostData > 0)
{
var postStream = new MemoryStream(_PostData);
requestMsg.Content = new HttpStreamContent(postStream.AsInputStream());
requestMsg.Content.Headers.Add(HeaderContentType, _ContentType);
requestMsg.Content.Headers.Add(HeaderContentLength, _ContentLength.ToString());
}
HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead;
requestTask = client.SendRequestAsync(requestMsg, completionOption).AsTask(request.CancelTokenSource.Token);
responseMessage = await requestTask;
// .. process response
}
catch(Exception e)
{
// handle errors
}
finally
{
if (requestMsg != null)
{
requestMsg.Dispose();
}
if (responseMessage != null)
{
responseMessage.Dispose();
}
if (httpFilter != null)
{
httpFilter.Dispose();
}
if (client != null)
{
client.Dispose();
}
}
最后的问题是设置内容长度。我改变了设置post数据的方式,现在它似乎起作用了:
if (_PostData != null && _PostData > 0)
{
requestMessage.Content = new HttpBufferContent(request.PostData.AsBuffer());
requestMessage.Content.Headers.Add(HeaderContentType, request.ContentType);
}
请确保您提供的客户端证书具有关联的私钥。能否提供有关错误的详细信息?调用堆栈?HResult?Uri、\u HttpMethod、\u ContentType、\u ContentLenth、HeaderContentType、HeaderContentLength的值是什么?我在exception and requestTask中得到的HResult为0x80070057。exception的HResult为0x80131500。使用Wireshark,我发布的数据可以很好地显示出来。我将wbxml数据发布到Exchange服务器。问题更多的是IIS服务器正在进行密钥交换并请求证书,但是没有发送我配置的证书,而是发送FIN,ACK。是的,HttpBufferContent比HttpStreamContent工作得更好,不知道为什么。。。!