我有以下代码打开文件流,读取块并将其发布到我的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迭代中关闭连接。
答案 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();
}