Ошибка Java.Net.SocketException: сокет закрыт в System.net.Http httpClient, возникает только при отправке файлов размером более 50 КБ - PullRequest
0 голосов
/ 08 октября 2019

Я делаю программу на xamarin, которая использует http-запросы для получения данных от API, созданного в net.core 2.0, но некоторые запросы (большинство из них на самом деле) заканчиваются следующей ошибкой:

  System.AggregateException: One or more errors occurred. ---> Java.Net.SocketException: Socket closed
  at Java.Interop.JniEnvironment+InstanceMethods.CallIntMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <286213b9e14c442ba8d8d94cc9dbec8e>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualInt32Method (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <286213b9e14c442ba8d8d94cc9dbec8e>:0 
  at Java.Net.HttpURLConnection.get_ResponseCode () [0x0000a] in <b781ed64f1d743e7881ac038e0fbdf85>:0 
  at Xamarin.Android.Net.AndroidClientHandler+<>c__DisplayClass45_0.<DoProcessRequest>b__1 () [0x00000] in <b781ed64f1d743e7881ac038e0fbdf85>:0 
  at System.Threading.Tasks.Task`1[TResult].InnerInvoke () [0x0000f] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Xamarin.Android.Net.AndroidClientHandler+<DoProcessRequest>d__45.MoveNext () [0x0036c] in <b781ed64f1d743e7881ac038e0fbdf85>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Xamarin.Android.Net.AndroidClientHandler+<SendAsync>d__40.MoveNext () [0x00230] in <b781ed64f1d743e7881ac038e0fbdf85>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Net.Http.HttpClient+<SendAsyncWorker>d__49.MoveNext () [0x000ca] in <25ebe1083eaf4329b5adfdd5bbb7aa57>:0 
   --- End of inner exception stack trace ---
  at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00011] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at System.Threading.Tasks.Task`1[TResult].GetResultCore (System.Boolean waitCompletionNotification) [0x0002b] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at System.Threading.Tasks.Task`1[TResult].get_Result () [0x0000f] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at FonoApp.Services.DataService.SendImageAsync (System.String token, FonoApp.Model.Imagem imagem) [0x00059] in C:\Projetos Sorri\FonoApp\AppTeste\AppTeste\Services\DataService.cs:154 
   --- End of inner exception stack trace ---}

Эта ошибка возникает в следующем фрагменте кода:

public async Task<String> SendImage(string token, Imagem imagem)
        {
            string baseAddress = @"http://192.168.0.4:5000/" + VersaoApi + @"/Imagem/";
            var json = JsonConvert.SerializeObject(imagem);
            var contentString = new StringContent(json, Encoding.UTF8, "application/json");
            client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", token);

            try
            {
                HttpResponseMessage tokenResponse = client.PostAsync(baseAddress, contentString).Result;//Erro ocorre nesta linha
                var jsonContent = tokenResponse.Content.ReadAsStringAsync().Result;
                return jsonContent;
            }
            catch (Exception e)
            {
                return e.InnerException.Message.ToString();
            }
        }

Из того, что я исследовал и обнаружил из этой ошибки, означает, что соединение закрывается либо сервером, либо клиентом, но я не могу 'Я даже не знаю, кто внезапно закрывает соединение, не говоря уже о предотвращении этой ошибки / ошибки, не знаю, имеет ли это значение, но я тестирую приложение на планшете Android 4.2-API 17. Заранее спасибо за любые рекомендации по этому вопросу, так как я все еще учусь программировать на C #. раньше я забыл сказать, что запросы Postman API работают без проблем

Я заметил кое-что интересное: ошибка, которую я получаю, возникает только при попытке отправить изображения размером более 100 Кб по запросу http, как я могу увеличить отправку? и получить лимит веса на моем сервере?

1 Ответ

0 голосов
/ 08 октября 2019

Во-первых, вам нужно использовать await вместо Result (), чтобы сделать этот метод асинхронным:

 var jsonContent = await tokenResponse.Content.ReadAsStringAsync();

И да, это исключение возникает при потере подключения к Интернету. Вы можете сделать эти вещи, чтобы сделать ваше приложение более удобным для использования:

  1. Отображать предупреждающее сообщение в блоке try-catch
  2. Проверить подключение к Интернету с помощью Xamarin.Essentials.Connectivity plugin
  3. Установите тайм-аут для вашего объекта HttpClient и перехватите исключение TimeoutException для отображения правильного сообщения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...