HttpWebRequest流写永远不会完成

时间:2011-06-02 21:14:31

标签: c# .net stream httpwebrequest

我发布的文件包含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块内。

3 个答案:

答案 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.TimeoutReadWriteTimeout属性。

答案 2 :(得分:0)

在构建请求时,您的内容长度也应包含标题,请确保其不仅仅设置为文件长度。 您可以尝试的另一件事是在完成所有操作后在流上调用.Flush()。 我不确定为HttpClient关闭流的含义,正如Jim所说,它可能会起作用,它可能会使它变得更糟。

使用System.Net.WebClient无法为您提供足够的灵活性吗?你可以使用一个很好的UploadFile()方法。