C# 使用ClientCert->Client cert not sent时,HttpClient失败,System.ArgumentException异常

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

我在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使用证书,有什么想法吗

以下是我正在使用的代码:

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工作得更好,不知道为什么。。。!