Schlechte Leistung beim Anbieten von Dateien zum Herunterladen mit HttpListener

Ich versuche mit einen einfachen Webserver zu erstellenHttpListener imC# und Dateien zum Download anbieten. Ich sehe wirklich schlechte Übertragungsraten, insbesondere im Vergleich zum Kopieren derselben Datei von einer Freigabe. Ist das bekanntHttpListener und was kann getan werden, um es zu verbessern?

Hier sind einige zusätzliche Informationen zu Recherchen, die ich zu diesem Problem durchgeführt habe. Die Download-Raten verbessern sich erheblich, wenn eine lokale Verbindung hergestellt wird. In diesem Fall erfolgt das Kopieren der Datei jedoch fast sofort. Daher ist es schwierig, ein Differenzverhältnis zu bestimmen. Bei einer Fernverbindung (LAN Umgebung, Maschinen direkt nebeneinander) Die Übertragungszeit beträgt jedoch ungefähr das 25-fache der Zeit einer einfachen Dateikopie von einer Freigabe. Die verfügbare Netzwerkbandbreite scheint nicht verwendet zu werden, um dies zu beschleunigen.

Ich habe einige andere Fragen und Diskussionen über gefundenHttpListener die auf ähnliche Probleme hinzuweisen scheinen, siehe hier:

HttpListener vs native Leistung

HttpListener-Leistungsoptimierung (Dies gilt jedoch nicht für Downloads.)

MSDN-Dokumente auch sagen, dassHttpListener basiert aufhttp.sys Dies ermöglicht eine Bandbreitendrosselung. Könnte es sein, dass hier eine unerwünschte Bandbreitendrosselung stattfindet oder stimmt etwas mit meinem Code nicht? Auf den von mir getesteten Computern (Windows 7 und Windows 2008 R2) war kein IIS vorhanden.

In meiner Stichprobe beginne ich eineHttpListener wie so:

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

Hier ist der Code für meinen einfachen Dateidownload:

<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: einige links gefixt ...)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage