首页 > 解决方案 > HttpWebRequest.GetRequestStream 无视 404 响应并允许写入

问题描述

在对 HTTP Post 到 RequestStream 中的问题进行故障排除时,我发现上传 4-16gb 数据几乎是瞬间发生的,只是为了让 Web 服务器报告我没有将 ContentLength 写入流。

在故障排除过程中,我注意到在wireshark 中我在请求响应流之后直接获得了fin/ack,但我无法验证在响应流中关闭此套接字。

当我最终查看 SSL 数据包时,它是从网络服务器返回的 404,但流完全不知道这个错误。

线鲨输出

HttpWebRequest oWebrequest = (HttpWebRequest)WebRequest.Create(oUri);
oWebrequest.ContentType = "application/x-vnd.vmware-streamVmdk";
oWebrequest.Method = Method.POST.ToString();
oWebrequest.AllowWriteStreamBuffering = false;
//oWebrequest.UnsafeAuthenticatedConnectionSharing = true;
oWebrequest.ReadWriteTimeout = (int)TimeSpan.FromMinutes(30).TotalMilliseconds;
oWebrequest.Timeout = (int)TimeSpan.FromMinutes(30).TotalMilliseconds;
oWebrequest.SendChunked = false;
oWebrequest.ServerCertificateValidationCallback +=
        (sender, cert, chain, error) =>
        {
        return true;
        };
oWebrequest.MaximumResponseHeadersLength = 1024;
System.IO.FileInfo fi = new System.IO.FileInfo(filePath);
oWebrequest.ContentLength = fi.Length;
Stream RequestStream = oWebrequest.GetRequestStream();
byte[] buffer = new Byte[(uint)Math.Min(1 * 1024, fi.Length)];
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length, FileOptions.SequentialScan))
{
    Int64 uploaded_bytes = 0;
    int chunk_size;
    double progress;
    try
    {
        double currentProgress = 0;
        // Stream the file in chunks
        while ((chunk_size = fs.Read(buffer, 0, buffer.Length)) > 0)
        {
        RequestStream.Write(buffer, 0, (int)chunk_size);
        RequestStream.Flush();
}

我本来希望在请求流写入或刷新时抛出异常以表明可能存在问题,但没有这样的发现。

所以我想知道,有没有更好、更安全的方法来上传一个大文件,并在处理网络服务器错误(如 404)方面取得进展?在被告知有问题之前将文件流的内容泵入死的 RequestStream 似乎很浪费。

标签: c#posthttpwebrequest

解决方案


推荐阅读