c#:如何使用 httpclient 发布异步请求并获取流?
Posted
技术标签:
【中文标题】c#:如何使用 httpclient 发布异步请求并获取流?【英文标题】:c#: How to Post async request and get stream with httpclient? 【发布时间】:2016-05-06 08:07:22 【问题描述】:我需要向服务器发送异步请求并从响应流中获取信息。 我正在使用 HttpClient.GetStreamAsync(),但应该使用 POST 的服务器响应。有没有类似 PostStreamAsync() 的方法?谢谢。
【问题讨论】:
【参考方案1】:如果您想使用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
选项,它告诉客户端不要将整个内容读入内存。
【讨论】:
【参考方案2】:使用HttpClient.PostAsync
可以通过HttpResponseMessage.Content.ReadAsStreamAsync()
方法获取响应流。
var message = await client.PostAsync(url, content);
var stream = await message.Content.ReadAsStreamAsync();
【讨论】:
请注意,这会将整个流读入内存。当他们计划使用流媒体时,这大多不是用户所期望的。【参考方案3】:也许你应该使用HttpWebRequest 而不是HttpClient?
它们提供异步方法和通过设置 method
属性在 post 和 get 之间切换的可能性。
例如:
var request = (HttpWebRequest) WebRequest.Create(uri);
request.Method = "POST";
var postStream = await request.GetRequestStreamAsync()
【讨论】:
以上是关于c#:如何使用 httpclient 发布异步请求并获取流?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Windows.Web.Http.HttpClient 类 PATCH 异步请求
在 C# 中使用 httpclient 保持 TCP 端口打开