我在Windows Phone Store上有一个应用程序,它是一个Feedly客户端,我的一些用户已经报告了一段时间的错误。
错误是JsonReaderException
:Unterminated string. Expected delimiter: ". Path 'items[0].summary.content', line 1, position 702
查看错误,似乎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
和{{ 1}}。
问题是我不知道哪一个是默认的,我不知道改变这个是否会解决问题,因为我自己无法重现问题,所以我不能测试它。
有没有人知道这里可能出现什么问题?
可能是各种各样的超时或ResponseHeadersRead
?
我已经看了一段时间的错误,正在寻找答案,我不知道可能会发生什么。
提前感谢您的帮助!
答案 0 :(得分:0)
为应用程序创建一个HttpClient。不要丢弃它。 HttpClient应该被重用而不是处理pr请求。这很可能是错误。