【发布时间】: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