【问题标题】:c#: How to Post async request and get stream with httpclient?c#:如何使用 httpclient 发布异步请求并获取流?
【发布时间】:2016-05-06 08:07:22
【问题描述】:

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

【问题讨论】:

    标签: c# asynchronous stream httpclient


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多