Плохая производительность при предложении файлов для загрузки с HttpListener

Я пытаюсь создать простой веб-сервер, используяHttpListener вC# и предлагать файлы для скачивания. Я вижу очень плохую скорость передачи данных, особенно по сравнению с копированием того же файла из общего ресурса. Это известноHttpListener и что можно сделать, чтобы улучшить его?

Вот некоторая дополнительная информация об исследованиях, которые я провел по этой проблеме. Скорость загрузки значительно улучшается при локальном подключении, но в этом случае копирование файла выполняется практически мгновенно, поэтому сложно измерить разницу. При удаленном подключении LAN окружающая среда, машины находятся рядом друг с другом) однако время передачи примерно в 25 раз больше времени простой копии файла из общего ресурса. Кажется, доступная пропускная способность сети не используется для ускорения этого процесса.

Я нашел несколько других вопросов и обсуждений оHttpListener которые указывают на похожие проблемы, см. здесь:

HttpListener против собственной производительности

HttpListener Оптимизация производительности (это не касается загрузок)

MSDN документы также утверждают, чтоHttpListener основан наhttp.sys который позволяет регулировать пропускную способность. Может быть, здесь происходит какое-то нежелательное ограничение полосы пропускания или что-то не так с моим кодом? На машинах, на которых я тестировал (Windows 7 и Windows 2008 R2), IIS отсутствовал.

В моем примере я начинаюHttpListener вот так

<code>  HttpListener listener = new HttpListener();
  listener.Prefixes.Add("http://*:80/");
  listener.Start();
</code>

Вот код для моей простой загрузки файла:

<code>  HttpListenerResponse response = null;
  try {
      HttpListenerContext context = listener.GetContext();

      response = context.Response;

      using( FileStream fs = File.OpenRead( @"c:\downloadsample\testfile.pdf" ) ) {

          byte[] buffer = new byte[ 32768 ];
          int read;
          while( ( read = fs.Read( buffer, 0, buffer.Length ) ) > 0 ) {
              response.OutputStream.Write( buffer, 0, read );
          }
      }

  } finally {
      if( response != null )
          response.Close();
  }
</code>

(редактировать: исправлены некоторые ссылки ...)

Ответы на вопрос(1)

Ваш ответ на вопрос