gpt4 book ai didi

c# - 使用 ClientCert -> 未发送客户端证书时,HttpClient 因 System.ArgumentException 而失败

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:44 24 4
gpt4 key购买 nike

我在 Windows Phone 应用程序中使用 Windows.Web.Http.HttpClient 时遇到问题。我正在使用需要客户端证书的服务器。当我调用 SendRequestAsync() 时,我收到“System.ArgumentException:值不在预期范围内。”

我将 ClientCertificate 设置为通过 HttpFilter 对象使用。

我在服务器上运行 Wireshark,我能够通过服务器 key 解密流量。在 Wireshark 中,我看到一个 TLSv1.2 Server Hello, Certificate, Certificate Request 数据包,服务器请求由颁发我通过的证书的同一个 CA 颁发的证书。在我看到证书请求数据包后,我立即看到客户端发送了一个 FIN, ACK 数据包。

请注意,我执行了两个 HTTPS 请求。第一个是 HTTP OPTIONS 请求,对于该请求,我确实看到正在传递的客户端证书(我确实收到了 HTTP 200 响应)。当我使用 HTTP POST 执行第二个请求时,我遇到了失败。两者使用相同的代码路径将请求发送到服务器。

关于如何让 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);
}

关于c# - 使用 ClientCert -> 未发送客户端证书时,HttpClient 因 System.ArgumentException 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com