Ich habe die Beiträge ASP.NET application pool shutdown problem und IIS 7.5: problem with Application pool gelesen, aber sie haben meine Frage nicht beantwortet.Warum wird mein IIS7-Anwendungspool nach einer Ausnahme in einer von einer ASP.NET-Seite aufgerufenen DLL heruntergefahren?
Ich habe eine C# ASP.NET-Seite, die in Code-Behind eine Klasse aus einer DLL über das BIN-Verzeichnis instanziiert, dann ruft eine Methode für diese Instanz. Die Methode innerhalb der DLL löst System.ArgumentException
aufgrund einer nicht vorhandenen Spalte in einem DataRow
Objekt aus. Das Ereignisprotokoll zeigt die folgende Fehlermeldung:
Source: ASP.NET 2.0.50727.0
Application ID: /LM/W3SVC/1/ROOT/...
Process ID: 9476
Exception: System.ArgumentException
Message: Column 'someColumn' does not belong to table.
StrackTrace:
Der Aufrufcode in der ASP.NET-Seite wickelt den Methodenaufruf in einem allgemeinen try-catch
Block. Wenn ich die Seite anfordere, stürzt dies den entsprechenden Anwendungspool meiner IIS-Instanz ab und meine Website ist nicht mehr verfügbar (Fehler 503). Ich muss den Anwendungspool manuell neu starten und die Site funktioniert wieder.
aktualisieren Wie forderte, den try catch
Block vom ASP.NET-Code hinter:
try
{
SomeExternalClass someExternalClass = new SomeExternalClass();
someExternalClass.SomeMethod(someId);
}
catch(Exception ex)
{
// "smp" is an instance of "StatusMessagePanel", a control we use on all pages
// to show error information, basically a div container with an icon.
smp.ShowError(ex.Message);
}
Jetzt ist meine Frage, warum eine relativ „einfache“ Ausnahme wie die System.ArgumentException
geworfen wird, wenn versucht, ein für den Zugriff auf nicht vorhandene DataRow
Spalte, stürzt die gesamte Website? Auch der generische Block try-catch
der ASP.NET-Seite hilft nicht, noch sollte dies der Grund sein, die gesamte Website komplett zu sperren, oder ist das eine falsche Annahme? Ich hätte nie gedacht, dass dies den (II) Server im Grunde nehmen kann.
In Erwartung der Leute, die mir sagen, dass ich auf Säulenexistenz prüfen sollte, bevor ich auf sie zugreife: Ich weiß darüber, und der Legacy-Code wurde jetzt geändert, aber das ist nicht meine Frage, wie oben beschrieben zu wissen, warum die Folgen so drastisch sind.
Update 2
Verfahren in Frage innerhalb der DLL aufgerufen wird startet einen Thread, der in einem try-catch
Block gewickelt wird:
[...]
try
{
ThreadStart starter =() => CreateReport(...)
Thread thread = new Thread(starter);
thread.Start();
if(!thread.Join(TimeSpan.FromMinutes(15)))
{
// Log some timeout warning
}
else
{
// Log information about successful report generation
}
}
catch(Exception ex)
{
// Log error information
}
Was im catch-Block passiert? Wenn das eine Ausnahme auslöst, könnten Sie in Schwierigkeiten geraten. Kannst du den Try Catch Code posten? – levelnis
Der catch-Block ruft eine Methode auf, die die Fehlermeldung nur für den Client (Browser) sichtbar macht, ich werde meine Frage aktualisieren. – Gorgsenegger
Nur um mir Spaß zu machen - wenn Sie den try-catch-Block vollständig entfernen und nur die Methode aufrufen, stürzt der App-Pool noch ab? – levelnis