android - 如何在 .NetStandard 上的 HTTPClient 中修复“java.io.IOException:连接上的流意外结束”异常
问题描述
我一直在用这个挠头一段时间。我正在 Xamarin 中构建一个 Android 应用程序,并且我有一个登录 POST 请求,该请求大部分都有效,但偶尔会收到此错误。我通知用户并告诉他们再试一次,但我仍然经常收到错误并希望修复它,以便应用程序提供更流畅的体验。
这是我登录 App Center 的堆栈跟踪:
LoginProvider+d__1.MoveNext () C:\source\repos{MyApp}{MyApp}{MyApp}\Services\LoginProvider.cs:35
java.io.IOException: unexpected end of stream on Connection{testclarity.i-menzies.com:443, proxy=DIRECT@ hostAddress=62.244.173.166 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=http/1.1} (recycle count=0)
com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210)
com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:905)
com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:789)
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:443)
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388)
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:501)
com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
Caused by: java.io.EOFException: \n not found: size=0 content=...
com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200)
com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
我正在使用 .NETStandard 2.0 和 Xamarin Forms 3.2.0.871581。
我搜索了大部分 Google 并确定这是各种 Android 库的问题,尤其是 OkHttp(我的堆栈跟踪中提到的同一个)。我已经尝试调查 Github 上的 .NETStandard 源代码以确定可能的原因,但我发现该项目很难导航,尤其是因为这个问题似乎是特定于 Android 的。任何有关寻找正确来源的建议都是理想的。
我根据互联网的建议尝试过的事情:
- 将我的连接标头设置为关闭。
- 将我的传输编码设置为分块。
- 在 Android 项目的属性中将 Android HttpClient 实现从 Android 换成 Default。
这些似乎是在线流行的建议之一,其中一些对人们有用,而另一些则不起作用。
另一个常见的建议是将 OkHttp 库的配置设置为 OkHTTP.setRetryOnConnectionFailure(true),这显然解决了许多人的问题,如下所示:https ://github.com/square/okhttp/issues/1517#issuecomment-144069139 。
此外,类似的错误似乎已在 Xamarin.Android 中提交:https ://bugzilla.xamarin.com/show_bug.cgi?id=41100 。但这已被标记为已修复。我不确定这是否会融入我的 Xamarin Forms 项目。
有谁知道我可以如何解决这个问题,或者我可以如何进一步调查超出我已经尝试过的内容?
解决方案
遵循此链接中的信息后:https ://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/http-stack?tabs=macos
并将我的 HTTPHandler 更改为本机 android 处理程序:
Xamarin.Android HttpClient 配置位于项目选项 > Android 选项中,然后单击高级选项按钮。
这些是 TLS 1.2 支持的推荐设置:
Visual Studio Android 选项
我错过的一个额外的一点是:
项目必须引用 System.Net.Http 程序集。
确保您的项目引用System.Net.Http否则它仍将使用 OKHttp
推荐阅读
- r - 如何在 R 中抑制“转换引入了无限值”警告?
- python - Django 没有要重定向到的 URL。提供一个 url 或在模型上定义一个 get_absolute_url 方法
- aws-java-sdk - AWS AmazonConfig listDiscoveredResources 未列出某些区域的资源
- c# - 窗口的WPF MaxWidth绑定不起作用
- r - depmixs4 状态估计列表
- c# - 如何使用restapi向Github存储库发出api请求?
- obiee - 上传新的 rpd 文件时现有数据模型被替换?
- javascript - MessageEmbed 字段值不能为空
- c# - 强制转换 C# 所需的参数是什么
- azure - 使用个人 Microsoft 帐户进行单点登录在 Azure 中的已注册应用程序中不起作用