HttpClient.GetStreamAsync() 有自定义请求?

HttpClient.GetStreamAsync() with custom request?

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

HttpClient.GetStreamAsync() 只接受字符串 requestUri 作为参数。所以不可能创建带有自定义 HttpRequestHeader、自定义 HttpMethod、自定义 ContentType、自定义内容等的请求?

我看到 HttpWebRequest 有时是 , but in my PCL (Profile111) there is no Add method for the Headers。那么我可以使用 HttpClient,我应该使用 HttpWebRequest 还是应该使用另一个 class/library?

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();

由于您提到可以使用不同的库,这里有一个使用 Flurl 的替代方法(免责声明:我是作者)。假设您想 POST 一些 JSON 数据与一对自定义 headers 并接收流:

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 为目标,即 fully compatible 和 PCL Profile111。