Ошибка Android HttpClient «Сокет закрыт» при медленных соединениях, но сервер успешно обрабатывает запросAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка Android HttpClient «Сокет закрыт» при медленных соединениях, но сервер успешно обрабатывает запрос

Сообщение Anonymous »

Я работаю над Android-приложением .NET MAUI, которое отправляет данные о заказах в веб-API с помощью HttpClient.
При обычных соединениях Wi-Fi все работает нормально, но когда я ограничиваю скорость сети примерно до 56 кбит/с (GPRS/HSCSD) для тестирования, иногда возникает такое исключение:

Код: Выделить всё

System.Net.Sockets.SocketException: Socket closed
Странно то, что заказ на самом деле успешно сохраняется на сервере, но клиент все равно выдает исключение.
Поэтому логика загрузки завершается сбоем локально, хотя серверная часть уже обработала запрос.
Вот упрощенная версия моего кода:

Код: Выделить всё

public async Task LocalOrderCompleteSavingRequest(PosSavingOrder requestModel)
{
using var httpClient = new HttpClient();

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "");
httpClient.DefaultRequestHeaders.Add("IntegrationID", "");

httpClient.Timeout = TimeSpan.FromSeconds(120); // tried increasing, still fails

try
{
var jsonContent = JsonSerializer.Serialize(requestModel);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

var response = await httpClient.PostAsync("", content);

if (response.IsSuccessStatusCode)
return true;

return false;
}
catch (Exception ex)
{
Console.WriteLine(ex);
return false;
}
}
При работе в очень медленной сети исключение возникает сразу после завершения загрузки, и в журнале отображается сообщение «Сокет закрыт».
API по-прежнему получает и успешно обрабатывает запрос POST.
Я хочу:
  • Определить, успешно ли сервер обработал запрос (даже
    если клиент не получил полный ответ).
  • Избегайте повторных загрузок, подтверждая успех перед повторной попыткой.
  • Изящно обрабатывайте частичные ответы или разрывы соединений.
Есть ли какой-нибудь способ в .NET (MAUI / Android), чтобы определить, было ли тело запроса полностью отправлено и сервер ответил до закрытия сокета? Пожалуйста, помогите мне найти решение этой проблемы.

Подробнее здесь: https://stackoverflow.com/questions/797 ... er-success
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»