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 ...)

questionAnswers(1)

yourAnswerToTheQuestion