Плохая производительность при предложении файлов для загрузки с 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>
(редактировать: исправлены некоторые ссылки ...)