HttpClient挂起以满足大量请求

时间:2018-01-05 19:11:40

标签: c# uwp windows-phone-8.1 windows-mobile

我在为Windows Phone 8.1开发的应用程序中遇到了一个问题,它的工作正常,但在Windows Mobile 10中,它仍然停留在GetAsync上。它不会抛出异常或任何东西,只是卡在那里无休止地等待。响应的内容长度为22014030字节。

using (HttpClient client = new HttpClient())
{
    using (HttpResponseMessage response = await client.GetAsync(url))
    {
        response.EnsureSuccessStatusCode();
        using (HttpContent content = response.Content)
        {
             return await content.ReadAsStringAsync();
        }
    }
}

我也尝试将其作为流阅读,但是一旦我尝试阅读内容正文,就不会再发生任何事情了。

调用此函数的代码声明为:

 public async Task<List<APIJsonObject>> DownloadJsonObjectAsync()
    {
        string jsonObjectString = await DownloadStringAsync(Constants.URL);

        if (jsonObjectString != null && jsonObjectString.Length >= 50)
        {
            List<APIJsonObject> result = await Task.Run<List<APIJsonObject>>(() => JsonConvert.DeserializeObject<List<APIJsonObject>>(jsonObjectString));

            return result;
        }

        return null;
    }

1 个答案:

答案 0 :(得分:0)

它被阻止的原因是因为你得到一个巨大的响应(20.9MB)HttpClient会在给你一个结果之前尝试下载。

但是,您可以告诉HttpClient在从服务器读取响应标头后立即返回结果,这意味着您可以更快地获得HttpResponseMessage。为此,您需要将HttpCompletionOption.ResponseHeadersRead作为参数传递给SendRequestAsync

HttpClient方法

以下是:

using (var client = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("GET"), url))
    {
        using (var response = await client.SendRequestAsync(request, HttpCompletionOption.ResponseHeadersRead)
        {
          //Read the response here using a stream for example if you are downloading a file
          //get the stream to download the file using: response.Content.ReadAsInputStreamAsync()
        }
    }
}