首页 > 解决方案 > 如何在 .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 的。任何有关寻找正确来源的建议都是理想的。

我根据互联网的建议尝试过的事情:

这些似乎是在线流行的建议之一,其中一些对人们有用,而另一些则不起作用。

另一个常见的建议是将 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 项目。

有谁知道我可以如何解决这个问题,或者我可以如何进一步调查超出我已经尝试过的内容?

标签: androidxamarinhttpclient.net-standard

解决方案


遵循此链接中的信息后: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


推荐阅读