Przeczytałem posty ASP.NET application pool shutdown problem i IIS 7.5: problem with Application pool, ale nie odpowiedział na moje pytanie.Dlaczego moja pula aplikacji IIS7 wyłącza się po wystąpieniu wyjątku w bibliotece DLL wywoływanej ze strony ASP.NET?
Mam stronę C# ASP.NET, która w kodzie-behind tworzy instancję klasy z biblioteki DLL dostarczanej przez katalog BIN, a następnie wywołuje metodę dla tej instancji. Metoda wewnątrz biblioteki DLL rzuca System.ArgumentException
ze względu na nieistniejącą kolumnę obiektu DataRow
. Dziennik zdarzeń pokazuje następujący błąd:
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:
kod wywołujący na stronie ASP.NET otacza wywołanie metody w ogólnej try-catch
bloku. Kiedy żądam strony, powoduje to awarię odpowiedniej puli aplikacji mojej instancji IIS i moja strona internetowa nie jest już dostępna (błąd 503). Ręcznie muszę zrestartować pulę aplikacji i witryna działa ponownie.
Aktualizuj Zgodnie z wnioskiem bloku try catch
z kodu ASP.NET za:
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);
}
Teraz moje pytanie brzmi, dlaczego stosunkowo „proste” wyjątek takich jak System.ArgumentException
wyrzucane podczas próby uzyskania dostępu do nieistniejąca kolumna DataRow
, powoduje awarię całej witryny? Również ogólny blok try-catch
strony ASP.NET nie pomaga, ani nie powinien to być powód, aby całkowicie uniemożliwić dostęp do całej witryny lub czy jest to błędne założenie? Nigdy bym nie pomyślał, że to może w zasadzie zabrać serwer (II).
W oczekiwaniu na ludzi, którzy mówią mi, że powinienem sprawdzić istnienie kolumny, zanim uzyskam do nich dostęp: wiem o tym i dotychczasowy kod został zmieniony, ale to nie jest moje pytanie, jak opisano powyżej, chciałbym wiedzieć, dlaczego konsekwencje są tak drastyczne.
Aktualizacja 2
Sposób pytanie miano wewnątrz DLL rozpoczyna wątek, który jest owinięty w try-catch
bloku:
[...]
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
}
Co dzieje się w bloku catch? Jeśli to spowoduje wyjątek, możesz mieć kłopoty. Czy możesz opublikować kod wypłaty? – levelnis
Blok catch wywołuje metodę, która powoduje, że komunikat o błędzie jest widoczny dla klienta (przeglądarki), zaktualizuję moje pytanie. – Gorgsenegger
Tylko po to, aby mnie zaskoczyć - jeśli całkowicie usuniesz blok try-catch i po prostu wywołasz metodę, czy pula aplikacji nadal się zawiesza? – levelnis