C# 使用HttpWebRequest.GetRequestStream()按块发送文件
我有一个非常简单的任务。在我的ASP.NETCore2中,我应该接受来自用户的文件url,并将文件二进制数据重新发送到我的内部微服务。我正在尝试在不将文件存储在磁盘或内存中的情况下执行此操作。只需接受文件块并将其发送到网络即可。我已经写了这个代码C# 使用HttpWebRequest.GetRequestStream()按块发送文件,c#,asp.net-core,.net-core,httpwebrequest,C#,Asp.net Core,.net Core,Httpwebrequest,我有一个非常简单的任务。在我的ASP.NETCore2中,我应该接受来自用户的文件url,并将文件二进制数据重新发送到我的内部微服务。我正在尝试在不将文件存储在磁盘或内存中的情况下执行此操作。只需接受文件块并将其发送到网络即可。我已经写了这个代码 int bytesToRead = 4096; byte[] buffer = new Byte[bytesToRead]; // getting download stream HttpWebRequest fileReq = (HttpWebRe
int bytesToRead = 4096;
byte[] buffer = new Byte[bytesToRead];
// getting download stream
HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(fileUrl);
HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();
if (fileReq.ContentLength > 0)
{
fileResp.ContentLength = fileReq.ContentLength;
}
// getting upload stream
var downloadStream = fileResp.GetResponseStream();
HttpWebRequest uploadRequest = HttpWebRequest.CreateHttp("url_to_send_file_data");
uploadRequest.Method = "POST";
uploadRequest.ContentLength = fileResp.ContentLength;
uploadRequest.ContentType = "application/octet-stream";
var uploadStream = await uploadRequest.GetRequestStreamAsync();
int length = 0;
do
{
length = await downloadStream.ReadAsync(buffer, 0, bytesToRead);
await uploadStream.WriteAsync(buffer, 0, length);
await uploadStream.FlushAsync();
}
while (length > 0);
// all file data in uploadStream._buffer so far
uploadStream.Close();
// only in this point request actually start
var result = await uploadRequest.GetResponseAsync();
downloadStream.Close();
根据手册和文章,请求应该在uploadRequest.GetRequestStream()
之后启动,所有uploadStream.WriteAsync()
调用都应该直接在网络中写入数据。但实际上,所有文件数据都写入了uploadStream.\u buffer,并且只有在调用GetResponseAsync()
之后才进入网络
我试图使用uploadRequest.SendChunked属性和HTTP头,但运气不好
他能帮忙提些建议吗
另外,是的,我知道
使用(){}
:)我不确定您在那里做什么,但是假设您有一个包含文件的POST请求,您可以使用它的流通过HttpClient传递到请求:
private async Task SendFileAsync(IFormFile file, HttpClient client)
{
var url = "url_to_send_file_data";
using (var fileStream = file.OpenReadStream())
using (var request = new HttpRequestMessage(HttpMethod.POST, url))
{
request.Content = new StreamContent(fileStream);
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
}
}
这将直接重用传入文件流,并将其用于传出请求