我发布的文件包含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()
以澄清我不是完整的白痴。另请注意,这是在 using()
的另一个 fileStream
块内。
答案 0 :(得分:2)
已解决:已关闭AllowWriteStreamBuffering
上的HttpWebRequest
。看起来当它打开时,无论Write()
调用写入最后一个字节,它都不会返回,直到内部缓冲区被清除。所以最后Write()
最终会竞争,直到我没有耐心。
因为我最初想要做的就是确定进步,所以关闭缓冲会使事情更加清晰。
答案 1 :(得分:1)
常见问题是忘记关闭请求流。您将看到的一个症状是永远不会发出请求。写入很可能正在完成,但由于您没有关闭请求流,因此对HttpWebRequest.GetResponse()
的调用似乎不会被执行。
尝试以下操作,看看它是否有所作为:
using (var requestStream = myRequest.GetRequestStream())
{
// write to the request stream here
}
// Now try to get the response.
另一个可能的问题是数据的大小。首先,您确定服务器可以处理15 MB的上传吗?其次,如果您在慢速连接上执行此操作,则15 MB可能需要一段时间才能发送。我有1.5兆比特/秒的“快速”上游连接。这至多是每秒0.15兆字节。发送15兆字节将需要一分半钟。
另一种可能性是请求超时。您想查看HttpWebRequest.Timeout
和ReadWriteTimeout
属性。
答案 2 :(得分:0)
在构建请求时,您的内容长度也应包含标题,请确保其不仅仅设置为文件长度。
您可以尝试的另一件事是在完成所有操作后在流上调用.Flush()
。
我不确定为HttpClient关闭流的含义,正如Jim所说,它可能会起作用,它可能会使它变得更糟。
使用System.Net.WebClient
无法为您提供足够的灵活性吗?你可以使用一个很好的UploadFile()
方法。