HTTPS Post failure
我正在尝试向Xamarin Forms应用程序上的API发送POST请求,但收到一条错误消息,指示发送请求时不存在信任关系。我不知道这是为什么以及如何解决。例外:
System.Net.Http.HttpRequestException: An error occurred while sending
the request ---> System.Net.WebException: Error: TrustFailure (The
authentication or decryption has failed.) ---> System.IO.IOException:
The authentication or decryption has failed. --->
System.IO.IOException: The authentication or decryption has failed.
---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010f at
Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord
(System.IAsyncResult asyncResult) [0x00031] in
/Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:430
at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord
(System.IAsyncResult ar, System.Boolean ignoreEmpty) [0x00000] in
/Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs:256
at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker
(System.IAsyncResult result) [0x00071] in
/Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs:418
--- End of inner exception stack trace ---
导致此异常的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | MultipartFormDataContent content = new MultipartFormDataContent(); content.Headers.Add("X-Auth-Token","eb27c17f-8bd6-4b94-bc4f-742e361b4e6a"); content.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg"); content.Add(new ByteArrayContent(myByteImage)); try { HttpResponseMessage response = await _client.PostAsync("https://10.54.66.160:9000/3/matching/search?list_id=3c9f2623-28be-435f-a49f-4dc29c186809&limit=1", content); string responseContent = await response.Content.ReadAsStringAsync(); } catch (Exception ex) { throw; } |
看来问题已解决,将以下代码放在
上
1 2 3 4 5 6 | System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => { if (cert != null) System.Diagnostics.Debug.WriteLine(cert); return true; }; |
为@ DanielA.White似乎HttpClient的mono实现不支持自签名证书。