如何在.NetStandard上的HTTPClient中修复“java.io.IOException:连接上的意外流结束”异常

问题描述 投票:3回答:1

我一直在用这个问题摸不着头脑。我正在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特有的。有关寻找合适来源的任何建议都是理想的。

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

  • 将我的连接标头设置为关闭。
  • 将我的传输编码设置为chunked。
  • 在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项目。

有谁知道我如何解决这个问题,或者我如何进一步调查我已经尝试过的东西?

android xamarin httpclient .net-standard
1个回答
0
投票

按照此链接中的信息: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选项

enter image description here

我错过了一个额外的位:

项目必须引用System.Net.Http程序集。

确保您的项目引用System.Net.Http,否则它仍将使用OKHttp

© www.soinside.com 2019 - 2024. All rights reserved.