HttpWebRequest.GetRequestStream не обращает внимания на 404 ответа и позволяет писать - PullRequest
1 голос
/ 26 апреля 2019

Устраняя проблему с HTTP Post в RequestStream, я обнаружил, что загрузка 4-16 ГБ данных происходила почти мгновенно только для того, чтобы веб-сервер мог сообщить, что я не записал ContentLength в поток.

Во время устранения неполадок я заметил, что в Wireshark я получал fin / ack сразу после запроса потока ответа, но я не смог проверить закрытие сокета в потоке ответов.

Когда я наконец-то посмотрел напакеты SSL, это был 404, возвращаемый с веб-сервера, но поток был совершенно неосведомлен об этой ошибке.

выход Wireshark

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, прежде чем сообщать о наличии проблемы.

...