Mal rendimiento al ofrecer archivos para descargar con HttpListener

Estoy tratando de crear un servidor web simple usandoHttpListener enC# y ofrecer archivos para descargar. Estoy viendo tasas de transferencia realmente malas, especialmente en comparación con copiar el mismo archivo de un recurso compartido. Es esto conocido porHttpListener ¿Y qué se puede hacer para mejorarlo?

Aquí hay información adicional sobre la investigación que he hecho sobre el problema. Las tasas de descarga mejoran mucho al conectarse localmente, pero en este caso, la copia se realiza casi instantáneamente, por lo que es difícil medir una proporción de diferencia. Cuando se conecta de forma remota (LAN Sin embargo, el tiempo de transferencia es aproximadamente 25 veces el tiempo de una copia de archivo simple de un recurso compartido. El ancho de banda de red disponible no parece ser usado para acelerar esto.

He encontrado algunas otras preguntas y discusiones sobreHttpListener que parecen indicar problemas similares, ver aquí:

HttpListener vs rendimiento nativo

Optimización del rendimiento de HttpListener (esto no es con respecto a las descargas sin embargo)

Documentos de MSDN también declare queHttpListener está basado enhttp.sys lo que permite la limitación de ancho de banda. ¿Podría ser que se esté produciendo una limitación de ancho de banda no deseada aquí o hay algún problema con mi código? En las máquinas con las que he probado (Windows 7 y Windows 2008 R2), IIS no estaba presente.

En mi muestra, estoy empezando unHttpListener al igual que:

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

Aquí está el código para mi simple descarga de archivos:

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

(edit: arreglado algunos enlaces ...)

Respuestas a la pregunta(1)

Su respuesta a la pregunta