xamarin.android - HttpClient.PostAsync 抛出 Javax.Net.Ssl.SSLException
问题描述
httpclient PostAysnc 方法有时会抛出 Javax.Net.Ssl.SSLException。我确信端点 url 和 httpContent 是有效的。这种异常只发生在非常低的频率。
异常消息是“读取错误:ssl=0x716ae3b788:发生 SSL_ERROR_WANT_READ。您永远不会看到这个。”
项目环境:Xamarin.Android with NETStandard.Library 2.0.3 Android 构建配置:HttpClient 实现:“AndroidClientHandler” SSL/TLS 实现:“Native TLS 1.2+”
下面是详细的堆栈跟踪:
Java.Interop
JniEnvironment+InstanceMethods.CallIntMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args)
Java.Interop
JniPeerMembers+JniInstanceMethods.InvokeVirtualInt32Method (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters)
Java.Net
HttpURLConnection.get_ResponseCode ()
Xamarin.Android.Net
AndroidClientHandler+<>c__DisplayClass46_0.<DoProcessRequest>b__1 ()
System.Threading.Tasks
Task`1[TResult].InnerInvoke ()
System.Threading.Tasks
Task.Execute ()
Xamarin.Android.Net
AndroidClientHandler.DoProcessRequest (System.Net.Http.HttpRequestMessage request, Java.Net.URL javaUrl, Java.Net.HttpURLConnection httpConnection, System.Threading.CancellationToken cancellationToken, Xamarin.Android.Net.AndroidClientHandler+RequestRedirectionState redirectState)
Xamarin.Android.Net
AndroidClientHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
System.Net.Http
HttpClient.SendAsyncWorker (System.Net.Http.HttpRequestMessage request, System.Net.Http.HttpCompletionOption completionOption, System.Threading.CancellationToken cancellationToken)
UbiParkLib.Services.ApiCommon
APIBaseService.Post (System.String endPoint, System.Object payload) /Users/kevinhu/Source/UbiParkApp/UbiParkApp/UbiParkLib/Services/ApiCommon/APIBaseService.cs:371
源代码:“await _httpClient.PostAsync(endPoint, httpContent)”是引发异常的行。
using (HttpContent httpContent = new StringContent(json, Encoding.UTF8, "application/json"))
{
using (var response = await _httpClient.PostAsync(endPoint, httpContent))
{
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
}
解决方案
我想我已经弄清楚了这个异常的原因和解决方案。原因是Android AndroidClientHandler 在处理HTTP 请求的过程中会抛出Java 异常。(然而,iOS Handler 会抛出 .NET HttpRequestException 或 WebException)。这些异常通常在网络不稳定时发生,如果我们再试一次应该没问题。对于我的情况,因为我应用了 Polly 策略,我只是捕获所有异常并通过字符串比较来获取异常类型名称。关于 android 处理程序的参考:github.com/xamarin/xamarin-android/issues/3216
推荐阅读
- python - 如何使用 matplotlib 绘制大范围值?
- c++ - 什么时候可以将 `typename` 与明确引用类型的标识符一起使用?
- json - 如何将 jq 与变量连接起来?
- javascript - AttributeError: 'WebElement' object has no attribute 'getElementById'
- read.csv - R crashes when trying to load CSV file
- java - How to check if json file contains specific value or not
- verilog - Questa 10.7b 中没有关于端口和分配的警告
- bash - ack 在 cronjob 中失败,但从命令行运行良好
- c - C:为什么我得到编译错误“取消引用指向不完整类型'struct xy'的指针”?
- linux - $(VAR) 的含义:在makefile中