HttpWebRequest.GetRequestStream忽略404响应并允许编写

时间:2019-04-26 12:56:55

标签: c# post httpwebrequest

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

在故障排除期间,我在Wirehark中注意到,我在响应流请求之后直接获得了一个fin / ack,但我无法验证此套接字在响应流中的关闭状态。

当我最终查看SSL数据包时,它是从Web服务器返回的404,但流对此错误完全不了解。

wireshark output

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之类的Web服务器错误的进度较大的大文件?在被告知存在问题之前,将文件流的内容泵送到无效的RequestStream上似乎很浪费。

0 个答案:

没有答案