Подтвердить что ты не робот

Ошибка загрузки: HttpWebRequest

Я использую HttpWebRequest для загрузки файла на определенный сервер, теперь проблема в том, что у меня возникают проблемы с производительностью.

Я не могу получить такую ​​же скорость загрузки, как у меня с браузером (Mozilla Firefox), скорость, которую я получаю, составляет 1/5 скорости, которую я получаю от браузера.

Вот мой объект HttpWebRequest

//headers is a NameValueCollection type object,
//Method is a struct { GET, POST, HEAD }

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.UserAgent = headers["User-Agent"];
        request.KeepAlive = false;
        request.Accept = headers["Accept"];
        request.AllowAutoRedirect = AllowRedirect;
        request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");
        request.Method = Method.ToString();
        request.AllowWriteStreamBuffering = false;
        request.ReadWriteTimeout = 60000;

Некоторые глобальные параметры, которые я сохранил,

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 200;
        ServicePointManager.MaxServicePointIdleTime = 2000;
        ServicePointManager.MaxServicePoints = 1000;
        ServicePointManager.SetTcpKeepAlive(false, 0, 0);

Как я отправляю файл в chunk...

            if (PostMethod == PostType.MultiPart && uploadFiles.Count > 0)
            {
                for (int i = 0; i < uploadFiles.Count; i++)
                {
                    string fileParam = uploadFiles.GetKey(i);
                    string tmpFilename = uploadFiles.Get(i);
                    string tmpData =
                    string.Format(
                        "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", boundary, fileParam, Path.GetFileName(tmpFilename), MimeType.GetMimeByExtension(Path.GetExtension(tmpFilename)));
                    byte[] tmpBytes = Encoding.Default.GetBytes(tmpData);
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;

                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);

                    //write the file
                    int fileBytesRead;

                    FileStream fileStream = File.Open(tmpFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
// buffer size = 8192
                    while ((fileBytesRead = fileStream.Read(buffer, 0, BUFFER_SIZE)) > 0) 

                    {
                        writer.Write(buffer, 0, fileBytesRead);
                        bSent += fileBytesRead;

                        int timeNow = Environment.TickCount;
                        if (timeNow - lastTime >= 500)
                        {
                            lastTime = timeNow;
                            arg.Progress = (int)(bSent * 100 / totalBytes);
                            arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                            OnProgress(arg);
                        }
                    }

                    tmpBytes = Encoding.Default.GetBytes("\r\n");
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;

                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);

                }
            }

Любая помощь очень ценится даже для того, чтобы помочь мне достичь 75% скорости загрузки браузера.

4b9b3361

Ответ 1

Я нашел ответ, выполнив поиск на этом сайте. Кажется, это дубликат ".NET HttpWebRequest Speed ​​versus Browser" .

Из ответов, размещенных там:

"В первый раз, когда вы запрашиваете страницу,.NET пытается определить параметры прокси-сервера. Решение состоит в том, чтобы передать пустой объект WebProxy. Таким образом, он просто подключается к удаленному серверу, а не к автоопределению прокси-сервера". - Markos

Попробуйте добавить

    request.Proxy = new WebProxy();

Ответ 2

Две вещи.

  • Вы проигрываете цели стеков TCP/IP путем фрагментации. TCP/IP предназначен для обработки почти асинхронной передачи данных. Он будет выполнять свои собственные операции и продолжать отправлять куски до тех пор, пока он не будет завершен или не достигнет максимального количества непризнанных кусков. Если максимальное количество блоков будет достигнуто, оно будет ждать ACK (подтверждение) для продолжения - подобно идее семафора, ожидайте, что выпуски могут быть "сложены", AKA - один ACK содержит последнюю полученную точку и может "освободить",/подтвердить несколько пакетов пакетов) - или время ожидания запроса.

    Соблюдая это, каждый кусок должен быть полностью признан, чтобы отправлять больше данных, чтобы увеличить свои накладные расходы. Вы по-прежнему используете одно и то же соединение, но по существу делаете несколько отдельных запросов. Кроме того, если размер блока TCP/IP не является делителем вашего размера блока (YOUR_CHUNK_SIZE% TCP_IP_CHUNK_SIZE!= 0), вы оставляете задерживающий блок TCP/IP, который должен тайм-аут и разрешать псевдо ACK; он получает подтверждение в следующий раз, когда он может в следующем фрагменте.

     2.

Другим вариантом, который может повлиять на производительность, является использование свойства UseNagleAlgorithm. Если для этого свойства установлено значение true, TCP/IP попытается использовать алгоритм TCP Nagle для HTTP-соединений. Алгоритм Nagle объединяет данные при отправке пакетов TCP. Он накапливает последовательности небольших сообщений в более крупные пакеты TCP, прежде чем данные будут отправлены по сети. Использование алгоритма Nagle может оптимизировать использование сетевых ресурсов, хотя в некоторых ситуациях производительность также может быть снижена. Как правило, для постоянной большой объемной пропускной способности улучшение производительности осуществляется с использованием алгоритма Нагле. Но для приложений с меньшей пропускной способностью можно увидеть ухудшение производительности.

Обычно приложение не требует изменения значения по умолчанию для свойство UseNagleAlgorithm, для которого установлено значение true. Однако, если приложение использует соединения с низкой задержкой, это может помочь установить это свойство false.

Из MSDN: HttpWebRequest Class (System.Net)

Ответ 3

Вот несколько вариантов использования, что мы можем увеличить скорость загрузки: -

http://bytes.com/topic/asp-net/answers/440179-how-speed-up-file-upload-2-0-a

используйте это в файле конфигурации для большого файла: ---

Запишите это в web config system.web >

httpRuntime maxRequestLength = "2097151"

это может помочь найти решение в IIS 7.0

Записать это в веб-конфигурацию system.web > httpModules

**add name="ITHitPutUploadProgressAndResumeModule" type="ITHit.WebDAV.Server.ResumableUpload.PutUploadProgressAndResumeModule, ITHit.WebDAV.Server"**