【问题标题】:HttpWebRequest - sending file by chunks and tracking progressHttpWebRequest - 按块发送文件并跟踪进度
【发布时间】:2012-04-17 08:52:41
【问题描述】:

我有以下代码通过发出 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被调用时,我能确定整个文件已经上传了吗?

【问题讨论】:

    标签: c# http sockets file-upload httpwebrequest


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。关于serverStream.Close的第二个问题呢?
    • 当你关闭请求流时,所有的数据都会被写入socket。实际上,您不应该像以前那样手动关闭那些 IDisposable 资源。您应该将它们包装在 using 语句中,以确保即使出现错误也能正确处理。
    • 嗯,现在我又困惑了:)。起初,您写道,当调用Write 时,该块被写入套接字。现在,您说当调用Close 时,所有数据都将写入套接字。如果您能用更简单的术语解释这一切,我将不胜感激,我可能仍然缺少一些东西。感谢您在这里与我相处!
    • 您在最后调用 .Close。毕竟在你的while循环中多次调用了Writes。因此,此时您正在调用 .Close ,因为您已经编写了所有内容,所以没有任何内容可写入套接字。但正如我所说 - 你不应该手动调用 .Close 。您应该将 IDisposable 资源(例如流)包装在 using 语句中。此外,如果您使用的是 .NET 4.0,您可以用一行代码替换整个 while 循环:fileStream.CopyTo(serverStream, 4096);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多