Zła wydajność podczas oferowania plików do pobrania za pomocą HttpListener

Próbuję stworzyć prosty serwer internetowy za pomocąHttpListener wC# i oferuj pliki do pobrania. Widzę naprawdę złe stawki transferu, zwłaszcza w porównaniu z kopiowaniem tego samego pliku z udziału. Czy to wiadomoHttpListener i co można zrobić, aby to poprawić?

Oto kilka dodatkowych informacji o badaniach, które zrobiłem na temat problemu. Szybkość pobierania znacznie poprawia się, gdy łączysz się lokalnie, ale kopiowanie pliku odbywa się niemal natychmiast w tym przypadku, więc trudno jest zmierzyć współczynnik różnicy. Podczas zdalnego łączenia (LAN środowisko, maszyny tuż obok siebie, jednak czas przesyłania wynosi w przybliżeniu 25 razy czas zwykłej kopii pliku z udziału. Dostępna przepustowość sieci nie wydaje się być wykorzystywana do przyspieszenia tego.

Znalazłem kilka innych pytań i dyskusjiHttpListener które wydają się wskazywać na podobne problemy, zobacz tutaj:

HttpListener a wydajność natywna

Optymalizacja wydajności HttpListener (nie dotyczy to jednak pobrań)

Dokumenty MSDN również to stwierdzamHttpListener oparta jest nahttp.sys co pozwala na ograniczenie przepustowości. Czy to możliwe, że dzieje się tutaj jakieś niepożądane ograniczenie przepustowości lub czy coś jest nie tak z moim kodem? Na komputerach, z którymi testowałem (Windows 7 i Windows 2008 R2), nie było IIS.

W mojej próbce zaczynamHttpListener w ten sposób:

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

Oto kod do mojego prostego pobrania pliku:

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

(edycja: poprawiono niektóre linki ...)

questionAnswers(1)

yourAnswerToTheQuestion