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

时间:2012-04-17 08:52:42

标签: c# http sockets file-upload httpwebrequest

我有以下代码通过发出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();

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

基于various sources,我认为我的代码将以4096字节块的形式上传文件,即将发出多个POST请求。但是当使用Fiddler跟踪请求时,它表明只发出了一个POST请求。另一方面,当我启用.NET network tracing时,生成的日志显示确实将4096个字节块写入请求流,并且每次写入操作始终打开套接字。

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

1 个答案:

答案 0 :(得分:2)

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

  

调用serverStream.Write时,提供的块实际上是通过网络发送的

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