Nancy: Viele gleichzeitige Anfragen

Erstellt am 16. Apr. 2016  ·  9Kommentare  ·  Quelle: NancyFx/Nancy

Beschreibung

Nancy kann nicht viele (<10) gleichzeitige Anforderungen gleichzeitig bedienen.

Schritte zum Reproduzieren

  1. Fügen Sie StaticContentsConventions hinzu, um Dateien aus einem Verzeichnis bereitzustellen.
  2. Kopieren Sie eine lange Videodatei in das Verzeichnis.
  3. Öffnen Sie das Video in Ihrem Browser in vielen Registerkarten (>10), indem Sie alle auf zB http://localhost/myvideo.mp4 zeigen.
  4. Beachten Sie: Video wird nicht auf allen Registerkarten angezeigt, sondern warten auf eine Verbindung, bis Sie andere Registerkarten schließen.

    Systemkonfiguration

  • Nancy-Version: 1.4.1
  • Nancy-Gastgeber: OWIN
  • Browser: Chrome

Hilfreichster Kommentar

Die beste Option, um nginx für statische Inhalte (oder einen anderen http-Server) zu verwenden.

Alle 9 Kommentare

Dies schreit nach einem häufigen Problem mit vollständigem iis auf Nicht-Server-Windows-Betriebssystemen. Welche Version von Windows/iis verwenden Sie (wenn überhaupt)?

Vergessen zu erwähnen: Ich verwende Selfhosting mit Microsoft.Owin.Host.HttpListener.
Vielleicht ist das das Problem?
Betriebssystem ist Windows 10.
Was wäre die beste Option für Selfhosting?

Die beste Option, um nginx für statische Inhalte (oder einen anderen http-Server) zu verwenden.

Ich stimme @Kiri-rin zu nginx ist perfekt für statische Inhalte und überlasse dann Nancy API-bezogene Dinge.

Nun, das Problem ist, dass ich auch nicht statischen Inhalt habe, der groß ist oder einige Zeit braucht, um ihn zu generieren.
Ich verstehe jedoch, dass dies kein häufiger Anwendungsfall ist.
Ich werde das weiter untersuchen. Wenn mir jemand einen Tipp geben könnte wo das Problem liegen könnte wäre das super.

@cody82 Wenn Sie lange laufende Routen haben, sollten Sie sie asynchron machen, damit sie die Anfrage-Threads nicht blockieren

Ja. Bedeutet das, dass das Problem nicht in der allgemeinen HTTP-Anforderungsbehandlung in Nancy liegt, sondern im Handler für statische Dateien, der asynchron nicht richtig verwendet?

Ich habe auch das gleiche Problem in ServiceStack erlebt, der die meisten seiner Behandlungen asynchron erledigt, aber dann eine synchrone Socket.Write-Funktion aufruft, die alles blockiert.

Ich habe das Problem zu GenericFileResponse.GetFileContent verfolgt:

c# private static Action<Stream> GetFileContent(string filePath, long length) { return stream => { using (var file = File.OpenRead(filePath)) { file.CopyTo(stream, (int)(length < BufferSize ? length : BufferSize)); } }; }

File.CopyTo blockiert also den Thread, während die Datei/das Video übertragen wird.
(Auch diese Klasse scheint nicht mit Teilantworten umzugehen, aber das ist ein anderes Problem.)
Ich bezweifle, dass dies einfach in eine asynchrone Funktion umgewandelt werden kann, aber ich kann mich irren?

(Auch diese Klasse scheint nicht mit Teilantworten umzugehen, aber das ist ein anderes Problem.)

@cody82 Ich habe eine PartialFileResponse für Video-/Audio-Streaming-Anwendungen erstellt: https://gist.github.com/danbarua/0fd9fcad5ec85e0c02dc

Benötigt ein wenig Aufräumarbeiten, könnte aber möglicherweise mit Nancy zusammengeführt werden oder die Funktionalität zu GenericFileResponse hinzugefügt werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen