【问题标题】:HttpClient not downloading the entire JSONHttpClient 没有下载整个 JSON
【发布时间】:2014-11-30 23:51:15
【问题描述】:

我在 Windows Phone 商店有一个应用程序,它是一个 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,它有两个选项:ResponseContentReadResponseHeadersRead。 问题是我不知道哪个是默认的,也不知道改这个能不能解决问题,因为我自己无法重现问题,所以无法测试。

有没有人知道这里可能存在什么问题? 可能是某种超时或HttpCompletionOption? 我已经看到错误有一段时间了,正在寻找答案,但我不知道可能发生了什么。

提前感谢您的帮助!

【问题讨论】:

  • 我知道这是旧的,但如果你找到了解决这个问题的方法,那对我很有帮助!

标签: c# json windows-phone dotnet-httpclient


【解决方案1】:

制作一个 HttpClient 供应用使用。不要丢弃它。 HttpClient 应该被重用而不是处理 pr 请求。这很可能是错误。

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多