C#: 如何使用HttpClient发送异步请求并获取流?

15

我需要向服务器发送异步请求,并从响应流中获取信息。 我使用HttpClient.GetStreamAsync(),但服务器响应应该使用POST。是否有类似的方法像PostStreamAsync()?谢谢。

我需要发送异步请求到服务器并从响应流中获取信息。我正在使用 HttpClient.GetStreamAsync(),但服务器返回应该使用 POST。是否有类似的方法像 PostStreamAsync()?谢谢。
3个回答

25

如果您想使用HttpClient来流式传输大数据,则不应使用PostAsync,因为message.Content.ReadAsStreamAsync会将整个流读入内存。相反,您可以使用以下代码块。

var message = new HttpRequestMessage(HttpMethod.Post, "http://localhost:3100/api/test");
var response = await client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);
var stream = await response.Content.ReadAsStreamAsync();

关键在于 HttpCompletionOption.ResponseHeadersRead 选项,它告诉客户端不要将整个内容读入内存。


1
如果您需要向POST请求添加内容,可以像这样添加: var request = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri(apiUrl), Content = content }; - RonnyR

2
使用HttpClient.PostAsync方法,您可以通过HttpResponseMessage.Content.ReadAsStreamAsync()方法获取响应流。
var message = await client.PostAsync(url, content);
var stream = await message.Content.ReadAsStreamAsync();

3
请注意,这将把整个流读入内存中。这通常不是用户在计划使用流时所期望的。 - lanwin

-1

也许你应该使用HttpWebRequest而不是HttpClient?

它们提供了异步方法和通过设置它们的method属性来切换post和get的可能性。

e.g:

var request = (HttpWebRequest) WebRequest.Create(uri);
request.Method = "POST";
var postStream = await request.GetRequestStreamAsync()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接