使用ClientCert时,HttpClient失败,出现System.ArgumentException->;未发
本文关键字:ArgumentException- gt System 未发 出现 ClientCert HttpClient 失败 使用 | 更新日期: 2023-09-27 18:27:42
我在Windows Phone应用程序中使用Windows.Web.Http.HttpClient时遇到问题。我使用的服务器需要客户端证书。当我调用SendRequestAsync()时,我得到一个"System.ArgumentException:值不在预期范围内"
我正在通过HttpFilter对象设置ClientCertificate。
我在服务器上运行Wireshark,我可以通过服务器密钥解密流量。在Wireshark中,我看到一个TLSv1.2服务器Hello,Certificate,CertificateRequest数据包,服务器请求由颁发我通过的证书的同一CA颁发的证书。在我看到Certificate Request数据包之后,我看到客户端发送了一个FIN,ACK数据包。
请注意,我处理两个HTTPS请求。第一个是一个HTTPOPTIONS请求,对于该请求,我确实看到了正在传递的客户端证书(我确实收到了一个HTTP200响应)。当我用HTTPPOST执行第二个请求时,我得到了失败。两者都使用相同的代码路径将请求发送到服务器。
关于如何让HttpClient使用证书,有什么想法吗?
这是我正在使用的代码:
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();
}
}
问题最终在于设置内容长度。我改变了设置帖子数据的方式,现在似乎可以工作了:
if (_PostData != null && _PostData > 0)
{
requestMessage.Content = new HttpBufferContent(request.PostData.AsBuffer());
requestMessage.Content.Headers.Add(HeaderContentType, request.ContentType);
}
确保您提供的客户端证书具有关联的私钥。