J'ai lu les publications Problème de fermeture du pool d'applications ASP.NET et IIS 7.5 : problème avec le pool d'applications mais elles n'ont pas répondu à ma question.
J'ai une page C# ASP.NET qui, en code-behind, instancie une classe à partir d'une DLL fournie via le répertoire BIN, puis appelle une méthode sur cette instance. La méthode à l'intérieur de la DLL lance System.ArgumentException
en raison d'une colonne inexistante dans un objet DataRow
. Le journal des événements affiche l'erreur suivante :
Source : ASP.NET 2.0.50727.0
ID de l'application : /LM/W3SVC/1/ROOT/...
ID du processus : 9476
Exception : System.ArgumentException
Message : La colonne 'someColumn' n'appartient pas à la table.
StrackTrace :
Le code d'appel dans la page ASP.NET enveloppe l'appel de méthode dans un bloc générique try-catch
. Lorsque je demande la page, cela provoque le blocage du pool d'applications correspondant de mon instance IIS et mon site web n'est plus disponible (Erreur 503). Je dois redémarrer manuellement le pool d'applications et le site fonctionne à nouveau.
Mise à jour Comme demandé, le bloc try catch
du code-behind ASP.NET :
try
{
SomeExternalClass someExternalClass = new SomeExternalClass();
someExternalClass.SomeMethod( someId );
}
catch( Exception ex )
{
// "smp" est une instance de "StatusMessagePanel", un contrôle que nous utilisons sur toutes les pages pour afficher les informations d'erreur, essentiellement un conteneur div avec une icône.
smp.ShowError( ex.Message );
}
Maintenant ma question est pourquoi une exception relativement "simple" comme System.ArgumentException
qui est lancée en essayant d'accéder à une colonne DataRow
inexistante, bloque tout le site web? Ni le bloc générique try-catch
de la page ASP.NET n'aide, ni cela devrait être la raison de rendre complètement le site web indisponible, ou est-ce une mauvaise hypothèse? Je n'aurais jamais pensé que cela pourrait en fait mettre le serveur hors service.
En anticipant les gens me disant que je devrais vérifier l'existence des colonnes avant d'y accéder : je sais cela et le code hérité a maintenant été modifié, mais ce n'est pas ma question telle que décrite ci-dessus, je voudrais savoir pourquoi les conséquences sont si drastiques.
Mise à jour 2
La méthode en question appelée à l'intérieur de la DLL démarre un thread qui est enveloppé dans un bloc try-catch
:
[...]
try
{
ThreadStart starter = () => CreateReport(...)
Thread thread = new Thread( starter );
thread.Start();
if( !thread.Join( TimeSpan.FromMinutes( 15 ) ) )
{
// Enregistrer un avertissement de dépassement de délai
}
else
{
// Enregistrer des informations sur la génération de rapport réussie
}
}
catch( Exception ex )
{
// Enregistrer des informations d'erreur
}