2014-11-30 6 views
0

У меня есть приложение в Windows Phone Store, это клиент Feedly, и некоторые из моих пользователей сообщают об ошибке на некоторое время. Ошибки является JsonReaderException: Unterminated string. Expected delimiter: ". Path 'items[0].summary.content', line 1, position 702HttpClient не загружает весь 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? Я некоторое время видел ошибку, ища ответ, и я не знаю, что может произойти.

Заранее благодарим за помощь!

+0

Я знаю, что это старый, но если вы нашли решение этой проблемы, это очень помогло бы мне! – Matt

ответ

0

Сделайте один HttpClient для использования приложения. Не уничтожайте его. Предполагается, что HttpClient должен быть повторно использован и не удален запросом pr. Скорее всего, это ошибка.

+0

Я попробую это. –

Смежные вопросы