HttpClient читает неполную или искаженную строку - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь выяснить, какая часть моего приложения (Xamarin Forms и прокси, написанные на PHP) содержит ошибки. Сначала я подумал, что мой прокси (написанный на PHP) некорректно работает с длинным набором данных (т. Е. Json, содержащим 1.300.000 символов) и возвращает некорректный ответ, но каждый запрос Postman дает мне правильный JSON, который успешно декодируется с помощью сторонние инструменты. Поэтому я предполагаю, что прокси работает хорошо.

Проблема заключается (я думаю) в расшифровке ответа в моем приложении Xamarin Forms (2.0.0-beta.22). Я использую HttpClient, чтобы прочитать ответ с этим кодом:

response.EnsureSuccessStatusCode();

var entries = new List<HistoryEntry>();
var content = await response.Content.ReadAsStringAsync();
_loggerService.Error(content);

response - это просто GetAsync ответ от HttpClient. Проблема в том, что content случайно неполно / неправильно сформирован. Сказав это, я имею в виду, что последний символ отсутствует (}), или ключи / значения JSON имеют дополнительный символ ", который нарушает все. К сожалению, я могу делать одни и те же запросы много раз, и однажды это сработает, однажды нет. Я обнаружил, что это происходит только с большим набором данных (как я упоминал ранее, длинная строка JSON).

Есть ли вероятность, что ReadAsStringAsync не ожидает полного ответа или каким-либо образом изменяет мою строку ответа? Как я могу найти причину неправильно загруженных данных?

РЕДАКТИРОВАТЬ 21.05.2019:

Просто скопировал действительный JSON (доступен здесь: https://github.com/jabools/xamarin/blob/master/json.txt) и вернул его из приложения Lumen на response()->json(json_decode(..., true)) и все тот же результат. Надеюсь, кто-то сможет воспроизвести это и помочь мне с этой проблемой :( Подробнее информация в комментариях.

Использовал этот код в C #:

Device.BeginInvokeOnMainThread(async () =>
            {
                for (int i = 0; i < 10; i++)
                {
                    var response = await client.GetAsync("<URL_TO_PHP>");
                    //var response = await client.GetAsync("https://jsonplaceholder.typicode.com/photos");
                    var content = await response.Content.ReadAsAsync<object>();
                    Debug.WriteLine("Deserialized: " + i);
                }
            });
...