HttpWebRequest - 按块发送文件并跟踪进度

本文关键字:跟踪 文件 HttpWebRequest | 更新日期: 2023-09-27 18:31:17

我有以下代码,通过发出 POST 请求将文件上传到服务器:

string fileName = @"C:'Console_sk.txt";
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create("http://" + Environment.MachineName + ":8000/Upload");
request.Method = "POST";
request.ContentType = "text/plain";
request.AllowWriteStreamBuffering = false;
Stream fileStream = new FileStream(fileName, FileMode.Open);
request.ContentLength = fileStream.Length;
Stream serverStream  = request.GetRequestStream();
byte[] buffer = new byte[4096];
while (true)
{
    int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    if (bytesRead > 0)
    {
        serverStream.Write(buffer, 0, bytesRead);     
    }
    else
    {
        break;
    }
}
serverStream.Close();
fileStream.Close();
request.GetResponse();

这将用于上传潜在的大文件,因此我们必须跟踪此上传的进度。

根据各种来源,我认为我的代码将以 4096 字节块上传文件,即将发出多个 POST 请求。但是,当使用 Fiddler 跟踪请求时,它显示只发出了一个 POST 请求。另一方面,当我启用 .NET 网络跟踪时,生成的日志显示确实将 4096 字节块写入请求流,并且始终为每个写入操作打开套接字。

总的来说,我对网络的理解很差,所以我不太明白这到底是如何工作的。调用serverStream.Write时,提供的块真的是通过网络发送的,还是只是缓冲在某个地方?当调用serverStream.Close时,我能确定整个文件都已上传吗?

HttpWebRequest - 按块发送文件并跟踪进度

HttpWebRequest类发送单个 HTTP 请求。您正在做的是分块写入请求,以避免将整个文件加载到内存中。您正在从文件中读取并以 4KB 的块直接写入请求流。

调用serverStream.Write时,提供的块是否真的通过网络发送

是的,它已写入网络套接字。