Mau desempenho ao oferecer arquivos para download com o HttpListener
Estou tentando criar um servidor web simples usandoHttpListener
emC#
e oferecer arquivos para download. Estou vendo taxas de transferência muito ruins, especialmente em comparação com a cópia desse mesmo arquivo de um compartilhamento. Isso é conhecido porHttpListener
e o que pode ser feito para melhorá-lo?
Aqui estão algumas informações adicionais sobre pesquisas que fiz sobre o problema. As taxas de download melhoram muito quando se conecta localmente, mas copiar o arquivo é feito quase instantaneamente nesse caso, por isso é difícil medir a taxa de diferença. Ao conectar remotamente (LAN
ambiente, máquinas próximas umas das outras) no entanto, o tempo de transferência é aproximadamente 25x o tempo de uma cópia de arquivo simples de um compartilhamento. A largura de banda de rede disponível não parece ser usada para acelerar isso.
Eu encontrei algumas outras perguntas e discussões sobreHttpListener
que parecem indicar problemas semelhantes, veja aqui:
HttpListener vs desempenho nativo
Otimização de desempenho do HttpListener (isso não é sobre downloads no entanto)
Documentos do MSDN também afirmar queHttpListener
é baseado emhttp.sys
que permite a otimização da largura de banda. Será que alguma limitação de largura de banda indesejada está acontecendo aqui ou há algo errado com o meu código? Nas máquinas com as quais testei (Windows 7 e Windows 2008 R2), não havia IIS presente.
Na minha amostra, eu estou começando umHttpListener
igual a:
<code> HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://*:80/"); listener.Start(); </code>
Aqui está o código para o meu download de arquivo simples:
<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>
(editar: consertei alguns links ...)