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()以澄清我不是一个完全的白痴。还要注意,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.TimeoutReadWriteTimeout属性。

当您构建请求时,您的内容长度也应该包括标头,确保它不仅仅设置为文件长度。你可以尝试的另一件事是,当一切都说了又做了时,在流上调用.Flush()。我不确定像Jim建议的那样关闭HttpClient流的含义,它可能会起作用,也可能会让情况变得更糟。

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

相关内容

  • 没有找到相关文章

最新更新