Отмена исключения в коде по http-запросу при ответе сервера 200 - PullRequest
0 голосов
/ 31 марта 2020

В моем проекте приложения Xamarin. iOS у меня есть критическая для меня ошибка. Когда я сначала отправляю запрос по http, я получаю исключение отмены, и только во второй раз я получаю результат успеха. В журналах доступа к серверу я вижу два успешных ответа, и мой скрипт PHP тоже запускается дважды, и в моей базе MySQL есть 2 запроса INSERT из php.

. попробуйте: - изменить сервер, - обновить мою ОС Ma c (до 10.15.4), - мою iPhone (с 13.1. * до 13.4, кстати, в базе Mysql я вижу пользователей с такой же проблемой с более старыми версиями iOS) - обновить Xcode (11.4) - обновить Visual Studio (8.5) и Xamarin - обновить систему. Net .Http (4.3.4) - попытаться установить CancellationToken и newClient.Timeout, но это не так. что-то изменить

В коде у меня есть дополнительная секунда, попробуйте подключиться, если он отменит. Если я удалю дополнительное соединение, у меня будет только исключение отмены.

Код:

private async Task<string> PostAndHandleHttpRequestAsync(Dictionary<string, string> content)
        {
            var cancellationTokenSource = new CancellationTokenSource();
            cancellationTokenSource.CancelAfter(100000 ); 
            CancellationToken token = cancellationTokenSource.Token;
            var newClient = new HttpClient();
            //client.Timeout = new TimeSpan(0, 1, 0);
            newClient.Timeout = TimeSpan.FromSeconds(200); // this is double the default
            var contentSerialize = JsonConvert.SerializeObject(content);
            try
            {
                var postAsyncResult = await newClient.PostAsync(GlobalSettings.urlToPHP, new StringContent(contentSerialize), token);
                var responseBody = await postAsyncResult.Content.ReadAsStringAsync();
                return responseBody;
            }

           catch (OperationCanceledException c)
            {
               //additional second try
               if (cancellationCounter == 0 ) 
                {
                    Console.WriteLine("second");
                    cancellationCounter = 1;
                    var postAsyncResult = await newClient.PostAsync(GlobalSettings.urlToPHP, new StringContent(contentSerialize), token);
                    Console.WriteLine("secondrio " + postAsyncResult.ToString());
                    var responseBody = await postAsyncResult.Content.ReadAsStringAsync();
                    return responseBody;
                }
                else
                {
                    cancellationCounter = 0;
                    return "Cancel";
                }

                Console.WriteLine("cancel exception " + c.ToString() + c.Message);
                return "Cancel";

            }

            catch (Exception e)
            {
                Console.WriteLine("Error PostAndHandleHttpRequestAsync " + e.Message);
                return "Error";
            }
        }

Пожалуйста, помогите? Вход на сервер выглядит так:

 [31/Mar/2020:14:48:21 +0300] "POST /CPMP-PROD4-10.php HTTP/1.0" 200 116 "-" "CocktailParty/4 CFNetwork/1125.2 Darwin/19.4.0"
[31/Mar/2020:14:48:21 +0300] "POST /CPMP-PROD4-10.php HTTP/1.0" 200 116 "-" "CocktailParty/4 CFNetwork/1125.2 Darwin/19.4.0"
 [31/Mar/2020:14:48:21 +0300] "POST /CPMP-PROD4-10.php HTTP/2.0" 200 116 "-" "CocktailParty/4 CFNetwork/1125.2 Darwin/19.4.0"
 [31/Mar/2020:14:48:21 +0300] "POST /CPMP-PROD4-10.php HTTP/2.0" 200 116 "-" "CocktailParty/4 CFNetwork/1125.2 Darwin/19.4.0"
...