Как исправить исключение «java.io.IOException: неожиданное завершение потока при соединении» в HTTPClient на .NetStandard - PullRequest
0 голосов
/ 22 января 2019

Я уже некоторое время чесал голову этим. Я создаю приложение для Android в Xamarin, и у меня есть 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 (той же, что упоминалась в моей трассировке стека). Я пытался исследовать источник .NETStandard на Github, чтобы определить возможную причину, но мне очень трудно ориентироваться в проекте, тем более что эта проблема, похоже, специфична для 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.

Кто-нибудь знает, как я могу решить эту проблему или как я могу исследовать дальше, помимо того, что я уже пробовал?

1 Ответ

0 голосов
/ 28 марта 2019

После следования информации по этой ссылке: 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

...