У меня есть приложение в Windows Phone Store, это клиент Feedly, и некоторые из моих пользователей сообщают об ошибке на некоторое время. Ошибки является JsonReaderException
: Unterminated string. Expected delimiter: ". Path 'items[0].summary.content', line 1, position 702
HttpClient не загружает весь JSON
Глядя на ошибках, то кажется, что HttpClient не загружать весь JSon, так как положение конца ответа и ответ кажется неполным.
Вот один из ответов:
{
"id":"user/{userIdOmmited}/category/global.all",
"updated":1417324466038,
"continuation":"149ebfc5c13:c446de6:113fbbc6",
"items": [{
"id":"HBKNOlrSqigutJYKcZCnF5drtVL1uLeqMvamlHXyreE=_149ff1f0f76:213a17:34628bd3",
"fingerprint":"eb0dc432",
"originId":"https://medium.com/p/7948bfedb1bc",
"updated":1417324463000,
"title":"Iran’s Stealth Drone Claims Are Total BS",
"published":1417324463000,"crawled":1417324466038,
"alternate":[{
"href":"https://medium.com/war-is-boring/irans-stealth-drone-claims-are-total-bs-7948bfedb1bc",
"type":"text/html"
}],
"summary":{
"content":"<div><p><a href=\"https://medium.com/war-is-boring/irans-stealth-drone-claims-are-total-bs-7948bfedb1bc\"><img height=\"200
Это вся Json одного из ответов, как вы можете видеть, что это заканчивается внезапно в summary.content, поэтому Json.Net не может десериализуйте его.
Мой Get метод выглядит следующим образом:
protected async Task<T> GetRequest<T>(string url)
{
var handler = new HttpClientHandler();
if (handler.SupportsAutomaticDecompression)
handler.AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate;
using (var client = new HttpClient(handler))
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
if (authentication != null)
request.Headers.Authorization = authentication;
var result = await client.SendAsync(request);
result.EnsureSuccessStatusCode();
var data = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(data.EscapeJson());
}
}
Я прохожу ответ DTO в качестве параметра дженериков к способу и десериализует JSon. Метод EscapeJson
в возвращении выглядит следующим образом:
public static string EscapeJson(this string stringToEscape)
{
return Regex.Replace(stringToEscape, @"(?<!\\)\\(?!"")(?!n)(?!\\)", @"\\", RegexOptions.IgnorePatternWhitespace);
}
Я добавил это, чтобы попытаться решить эту проблему, потому что я думал, что проблема была с обратными косыми чертами, но это не было (прежде чем я узнал json не загружался полностью).
Я искал решение этой проблемы в течение нескольких недель, и я не мог найти ответа.
В моих исследованиях я обнаружил, что есть параметр в SendAsync
, который является completionOption, который представляет собой перечисление, HttpCompletionOption
, что есть два варианта: ResponseContentRead
и ResponseHeadersRead
. Проблема в том, что я не знаю, какой из них является значением по умолчанию, и я не знаю, изменит ли это проблему, потому что я не могу воспроизвести проблему самостоятельно, поэтому я не могу ее протестировать.
У кого-нибудь есть идея, что может быть проблемой здесь? Может ли это быть тайм-аутом такого типа HttpCompletionOption
? Я некоторое время видел ошибку, ища ответ, и я не знаю, что может произойти.
Заранее благодарим за помощь!
Я знаю, что это старый, но если вы нашли решение этой проблемы, это очень помогло бы мне! – Matt