【问题标题】:How to fix a "java.io.IOException: unexpected end of stream on Connection" exception in HTTPClient on .NetStandard如何在 .NetStandard 上的 HTTPClient 中修复“java.io.IOException:连接上的流意外结束”异常
【发布时间】:2019-01-22 12:31:11
【问题描述】:

一段时间以来,我一直在为这个挠头。我正在 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 HttpClient 实现从 在 Android 项目的属性中将 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 项目。

有谁知道我可以如何解决这个问题,或者我可以如何在我已经尝试过的范围之外进行进一步调查?

【问题讨论】:

  • 尝试通过使用托管 HttpClientHandler 和 BoringSLL SSL.TLS 实现来避免 OkHttp 堆栈,至少如果这是客户端问题(即保持活动时间)而不是服务器问题(服务器正在关闭保持活动套接字连接)(还有你的服务器上设置的保持活动超时时间是多少?,你能增加它吗?)
  • @SushiHangover - 我将按照您的建议尝试托管 HttpClientHandler 和 BoringSLL。我需要与我的团队核实服务器上的保持活动时间,因为我不确定这是如何设置的。感谢您的建议,我会报告,因为我想帮助任何可能遇到同样问题的 Xamarin 开发人员!
  • 关于这个问题的任何更新?
  • 嗨@NathanCrama。根据 SushiHangover 的有用建议,我将我的 Android 项目切换到了 Android 客户端实现,如本文所述:github.com/xamarin/xamarin-android/issues/…。自从这样做以来,我还没有发现问题。
  • 好的,谢谢。根据此页面:docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…,我希望有更好的东西,因为微软似乎不鼓励沿着这条路线走下去,但仍然感谢您的回答。

标签: android xamarin httpclient .net-standard


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以直接进入 Android 项目 > 属性 > AssemblyInfo.cs 文件。 打开 AssemblyInfo 文件并在末尾添加以下行:

    [程序集:应用程序(UsesCleartextTraffic = true)]

    这帮助我解决了我的问题。希望对你也有帮助

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题并一直在跟踪此修复程序。我的项目参考 到 System.Net.Http。 当我遇到此异常时,我正在将我的 HTTPHandler 更改为本机 android 处理程序,但在使用不同的 HTTPHandler 时却遇到了类似的系统异常。 我尝试了很多建议,最后通过在我的基本 URL 中使用 https 解决了这个问题。这是我的参考:https://github.com/square/okhttp/issues/1517#issuecomment-560486265

      IMO,每种情况下的修复方法可能不同,因此您可能想尝试其他建议。

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 2019-03-14
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 2020-08-08
        相关资源
        最近更新 更多