Ich entwickle einen Web-Service mit ASP.NET MVC3. Eine der Methoden der HTTP-API empfängt ein Bild vom Hauptteil einer POST-Anforderung und muss es zur weiteren Verarbeitung auf der Festplatte speichern. Der Beginn des Verfahrens ist wie folgt:ASP.NET (oder IIS?) Verhalten bei gleichzeitiger Anfragen
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Interlocked.Increment(ref _generateCount);
byte[] fileBuffer;
using (Stream inputStream = Request.InputStream)
{
if (inputStream.Length == 0)
{
Trace.WriteLine("Submitted file is empty", "Warning");
inputStream.Close();
Interlocked.Decrement(ref _generateCount);
return new HttpStatusCodeResult(400, "Content is empty");
}
fileBuffer = new byte[inputStream.Length];
inputStream.Read(fileBuffer, 0, (int)inputStream.Length);
inputStream.Close();
}
stopwatch.Stop()
... (storing the fileBuffer on disk & quite CPU intensive processing on the file)
ich den Dienst in einer kleinen Azure Instanz bin Hosting.
Jetzt ist das seltsame Verhalten, das ich habe, wenn ich parallele Anfragen an den Dienst ausstelle. Nehmen wir an, ich stelle eine erste Anfrage, und eine zweite 5 Sekunden später. Wie Sie sehen, verwende ich eine Stoppuhr, um die Leistung zu überwachen. Für die erste Anfrage wird die ElapsedTime sehr klein sein (weniger als eine Sekunde), aber für die zweite wird sie normalerweise ca. 14 Sekunden!
Beachten Sie, dass die durchschnittliche Bearbeitungszeit für eine einzelne Anfrage ca. 25 Sekunden (und erreicht 40+, wenn mehrere Anfragen verarbeitet werden), so dass ich 14 Sekunden später meinen Eingabestream gelesen habe, obwohl die erste Anfrage noch nicht abgeschlossen ist.
Wie kann ich diese Verzögerung erklären?
Dank
Hallo, Ich habe den Stream im Speicher für Debug-Zwecke geladen, aber das Löschen des Streams direkt auf der Festplatte scheint in der Tat das Problem zu lösen. Wie würdest du den Unterschied erklären? Oder kommt es von meinem inputStream.Close(), das auf eine Synchronisierung von IIS warten würde? – ThomasWeiss
Wenn ich log4net Protokollierung für Debugging-Zwecke verwende und die Protokollanweisungen in eine bestimmte Datei schreibe. Würden die parallelen HTTP-Anfragen diese Protokolldatei überschreiben? – teenup
@teenup, nein die Datei wird nicht überschrieben, Nachrichten werden an sie angehängt. –