我发布了一个带有HttpWebRequest
的文件,以及页眉和页脚。页眉(约0.5K)和实际文件似乎写得很好,但对于大文件(约15MB),页脚(约29字节)似乎永远不会写。
using (Stream requestStream = request.GetRequestStream()) {
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
byte[] buffer = new byte[Math.Min(4096L, fileSize)];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
requestStream.Write(buffer, 0, bytesRead);
}
// next line never completes
requestStream.Write(postFooterBytes, 0, postFooterBytes.Length);
// code below is never reached
Console.WriteLine("Why do I never see this message in the console?");
}
有什么想法吗?
ETA:尝试在最后一个Write()
之前冲洗流,这可能会有所帮助,但没有效果。
再次编辑:添加using()
以澄清我不是一个完全的白痴。还要注意,BTW,这是在fileStream
的另一个using()
块内。
已解决:关闭HttpWebRequest
上的AllowWriteStreamBuffering
。看起来当它打开时,无论Write()
调用写入最后一个字节,它都不会返回,直到内部缓冲区被清除。所以最后一个Write()
最终还是在竞争,直到我失去耐心。
由于我最初想做的是确定进度,所以关闭缓冲无论如何都会让事情变得更清楚。
一个常见的问题是忘记关闭请求流。您将看到的症状之一是从未提出请求。写入很可能真的完成了,但由于您没有关闭请求流,对HttpWebRequest.GetResponse()
的调用似乎没有执行。
试试下面的方法,看看它是否有区别:
using (var requestStream = myRequest.GetRequestStream())
{
// write to the request stream here
}
// Now try to get the response.
另一个可能的问题是数据的大小。首先,你确定服务器可以处理15 MB的上传吗?其次,如果您在慢速连接上执行此操作,则发送15MB可能需要一段时间。我有一个1.5兆比特/秒的"快速"上行连接。这充其量是每秒0.15兆字节。发送15兆字节需要一分半钟。
另一种可能性是请求超时。您需要查看HttpWebRequest.Timeout
和ReadWriteTimeout
属性。
当您构建请求时,您的内容长度也应该包括标头,确保它不仅仅设置为文件长度。你可以尝试的另一件事是,当一切都说了又做了时,在流上调用.Flush()
。我不确定像Jim建议的那样关闭HttpClient流的含义,它可能会起作用,也可能会让情况变得更糟。
使用System.Net.WebClient
是否没有为您提供足够的灵活性?有一个很好的UploadFile()
方法你可以使用。