我是否在忙于多个请求?

时间:2018-06-29 23:35:33

标签: c# .net

我有以下代码打开文件流,读取块并将其发布到我的Web服务。我想知道这段代码是否忙于为每个块创建一个请求?如果是这种情况,它似乎并不高效。如果我的文件为10MB,并且每4KB发出一个请求,那么大约发送了2500个请求。

代码如下:

using (var httpClient = new HttpClient())
{
    using (var inputStream = new FileStream(filePath, FileMode.Open))
    {
        byte[] buffer = new byte[4096]; // 4KB
        // Read from file stream
        int bytesRead = inputStream.Read(buffer, 0, buffer.Length);
        while (bytesRead > 0)
        {
            var formData = new MultipartFormDataContent
            {
                new ByteArrayContent(buffer, 0, buffer.Length)
            };

            // Post to server
            HttpResponseMessage response = await httpClient.PostAsync(uri, formData);
            response.EnsureSuccessStatusCode();

            // Read next buffer
            bytesRead = inputStream.Read(buffer, 0, buffer.Length);
        }
    }
}

有没有更有效的方法将字节数组流式传输到Web服务?

更新

如果用户需要上传10GB的文件,则在一个请求中上传整个文件没有意义。如果上传失败,则用户可以从成功发送的最后一个块中重试。我也想显示上传进度。我知道在发出多个请求时打开和关闭连接是一种不好的做法,但是我不确定我使用HttpClient的方式是否只是打开连接,发出所有请求然后关闭连接,或者我是否正在打开并在每次while迭代中关闭连接。

1 个答案:

答案 0 :(得分:0)

使用StreamContent发布整个文件。

using (var httpClient = new HttpClient()
using (var inputStream = new FileStream(filePath, FileMode.Open))
{
   var formData = new MultipartFormDataContent
   {
      new StreamContent(inputStream)
   };
   var response = await httpClient.PostAsync(uri, formData);
   response.EnsureSuccessStatusCode();
}