【问题标题】:HttpClient.GetStreamAsync() with custom request?带有自定义请求的 HttpClient.GetStreamAsync()?
【发布时间】:2017-11-27 14:33:51
【问题描述】:

我的目标是使用HttpClient 类发出网络请求,以便我可以将响应写入文件(解析后)。因此我需要Stream 的结果。

HttpClient.GetStreamAsync() 只接受字符串requestUri 作为参数。那么就不可能用自定义HttpRequestHeader、自定义HttpMethod、自定义ContentType、自定义内容等创建请求了吗?

我看到HttpWebRequest 有时是used instead,但在我的PCL(Profile111)中没有AddHeaders 方法。那么我可以使用HttpClient,我应该使用HttpWebRequest,还是应该使用另一个类/库?

【问题讨论】:

  • 看看HttpClient.DefaultRequestHeaders 并通过那里设置你的标题
  • 您可以随时使用SendAsync 并阅读流内容。
  • @Crowcoder: SendAsync 返回HttpResponseMessage。如何在此处流式传输内容?
  • @testing - 通过.Content.ReadAsStreamAsync?
  • @Damien_The_Unbeliever:感谢您的提示。响应是否完全保存在内存中,然后转换为流?我想尽量减少内存占用,因为我在这里处理更大的文件。

标签: c# xamarin.forms stream portable-class-library dotnet-httpclient


【解决方案1】:

GetStreamAsync 只是构建和发送无内容 GET 请求的捷径。做“很长的路”是相当简单的:

var request = new HttpRequestMessage(HttpMethod.???, uri);
// add Content, Headers, etc to request
request.Content = new StringContent(yourJsonString, System.Text.Encoding.UTF8, "application/json");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
var stream = await response.Content.ReadAsStreamAsync();

【讨论】:

  • ~~等待您提供的SendAsync 调用会导致整个响应被我读入内存。使用await client.GetStreamAsync(url); 可以让我在不将整个响应放入内存的情况下切换流。当我在之前和之后对堆进行快照时,我可以在内存中看到所有 60+MB 的下载文件,而在后者中,堆只增加了 5MB 左右。~~错过了 HttpCompletionOption!
  • 在读取大型流或连接永远不会关闭的服务器端事件 (SSE) 时,这不起作用。它只会卡在 SendAsync 方法上,永远不会继续。
【解决方案2】:

由于您提到对使用不同的库持开放态度,这里有一个使用 Flurl 的替代方案(免责声明:我是作者)。假设您想发布一些带有几个自定义标头的 JSON 数据并接收流:

var stream = await "https://api.com"
    .WithHeaders(new { header1 = "value1", header2 = "value2" })
    .PostJsonAsync(data)
    .ReceiveStream();

这里data 只是一个 POCO。不用担心将其序列化为 JSON 字符串或将 Content-Type 设置为 application/json; Flurl 会为你做这两件事。

Flurl 在后台使用 HttpClient 并针对 .NET Standard 1.1,即带有 PCL Profile111 的 fully compatible

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2016-11-12
    • 2015-05-28
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多