Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpWebRequest.GetRequestStream()按块发送文件_C#_Asp.net Core_.net Core_Httpwebrequest - Fatal编程技术网

C# 使用HttpWebRequest.GetRequestStream()按块发送文件

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

我有一个非常简单的任务。在我的ASP.NETCore2中,我应该接受来自用户的文件url,并将文件二进制数据重新发送到我的内部微服务。我正在尝试在不将文件存储在磁盘或内存中的情况下执行此操作。只需接受文件块并将其发送到网络即可。我已经写了这个代码

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();
    }
}
这将直接重用传入文件流,并将其用于传出请求