J'essaie de montrer une page d'erreurs client dans ASP.NET lorsque la base de données est en panne. J'utilise le mode SQL Server pour contenir les données de session. Le problème est que la page Erreurs personnalisée n'est jamais appelée. p>
Étant donné que les données de session et la base de données sont sur le même serveur, cela ne redirige pas de la page d'erreur personnalisée? Je suppose que l'application Web n'a pas été chargée à ce stade ?. L'utilisateur est présenté avec la trace de la pile pour la défaillance de la connexion de l'état de la session. P>
Il semble que nous ayons besoin de quelque chose qui se trouve devant le site Web initial, chargez-vous pour vérifier la connectivité à la base de données. Des idées sur la manière de mettre en œuvre cela? P>
3 Réponses :
Ajouter quelque chose comme ceci à votre web.config? Vous pouvez lire plus d'informations Ici p> Si c'est votre SQLSessionState qui échoue, vous devez gérer l'erreur correspondante dans l'événement Vous pouvez lire plus d'informations ici P> P> P> P> P> P> > Application_Error code> dans
global.asax code > p>
Comment puis-je connaître le code de statut lorsque le DB est en panne?
De plus, cela ne frappe pas le point de débogage si je place dans l'événement Application_Error?
Si vous ne spécifiez pas de code d'état, vous êtes poussé à la redirection par défaut.
Je crois que le problème est que l'IIS tente de charger l'application, mais que le fournisseur d'Etat de la session échoue sur la connexion à la base de données, elle est perçue comme une erreur de configuration dans le fichier Web.config et non une erreur d'application. Voir ma réponse :)
Dans ce cas, vous devez utiliser l'événement applic_error code> dans
global.asax code>
@Flyingstreudel Non Ce n'est pas correct, ce n'est pas une erreur d'application, c'est une erreur de configuration - l'application n'est pas exécutée, c'est un module initialisé qui provoque l'erreur. Global.asax n'entre pas en jeu. Consultez mon commentaire sur l'utilisation d'un module HTTP sur le message d'origine.
@jamiebarrow - Afaik Vous ne pouvez pas attraper des erreurs de configuration. Ils sont projetés par le CLR, pas votre application au moment où le web.config est lu. Si vous obtenez des erreurs de configuration à la suite de l'initialisation de votre fournisseur d'État, vous devrez modifier votre approche. Le web.config doit toujours réussir si vous souhaitez que l'un de votre code d'application soit exécuté.
J'espérais que l'utilisation de IIS7 avec un pipeline intégré permettrait de saisir l'erreur en utilisant un module HTTP. J'ai essayé de créer deux modules personnalisés, une configuration de lancementException à l'init (), à la fois événement d'erreur de traitement, et aucun des gestionnaires d'événements tirés. Il semble que vos pensées soient correctes, vous ne pouvez pas gérer l'erreur "config" à la suite de l'initialisation. Dommage C'est la manière dont le fournisseur d'État de la session Microsoft Appfabric Cache Session fonctionne :( Devinez une approche d'emballage est nécessaire, ce qui protège l'exception.
Je pense que l'erreur provient du fait que, parce que vous utilisez un fournisseur d'état de session de la mémoire (étant la base de données), et la connexion à la base de données a une défaillance, alors une erreur perçue dans la configuration Web (pas dans l'application). J'ai un problème similaire, où j'utilise le cache Appfabric pour mon fournisseur d'état de session, mais lorsque le service Appfabric cache est en panne, je reçois la page d'erreur de configuration. P>
Pour cette raison, vous ne pouvez pas utiliser la solution CustomErrors, car FlyingStreudel a déjà suggéré, car ce n'est pas une erreur dans votre application, mais plutôt dans le chargement de la configuration. P>
J'ai regardé autour de vous pour un moyen de résoudre ce problème, mais je ne pouvais en trouver aucun. J'espère que cette question est répondue, cela m'a déjà confondu avec les différentes options de configuration d'erreur ... p>
Je ne serais pas surpris si le problème de l'affiche original est identique - la connexion au serveur SQL se produisant dans l'initialisation de la sessionStatemodule. P>
Je pense que la réponse est peut-être pour écrire un module HTTP personnalisé [ msdn.microsoft.com /en-us/library/ms227673.cax ]
Ou peut-être pas, voir que l'ordre d'exécution des modules n'est apparemment pas prévisible [ forums.asp.net/t/1101427.aspx/1?httpmodule+Execute+order ]
"Pour chaque événement, les manipulateurs d'événements pour chaque module sont exécutés dans l'ordre dans lequel les modules sont configurés dans la section de configuration
Parce que la page d'erreur est une page ASP.NET (je peux le voir à partir de votre commentaire), il frappera la base de données de la session dans le cycle de vie de la page.
Vous devez définir ci-dessous la directive sur error.aspx page pour dire ASP.NET à ne pas charger les informations de session pour cela: Veuillez noter que cela ne fonctionnera que si vous n'utilisez aucune information de session dans La page d'erreur. p> En outre, j'ai également géré Global.Asax Page ci-dessous: P> private static Exception startException;
protected void Application_Start()
{
try
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
}
catch (Exception ex)
{
startException = ex;
}
}
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
".js", ".css", ".png",".jpg",".jpeg",".gif",".bmp"
};
public bool IsStaticFile(HttpRequest request)
{ //My project was a mix of asp.net web forms & mvc so had to write this
if (Request.RawUrl.ToLower().Contains("/bundles/") || Request.RawUrl.ToLower().Contains("/frontendcss?") ||
Request.RawUrl.ToLower().Contains("/fonts/")
//these are my css & js bundles. a bit of hack but works for me.
)
{
return true;
}
string fileOnDisk = request.PhysicalPath;
if (string.IsNullOrEmpty(fileOnDisk))
{
return false;
}
string extension = Path.GetExtension(fileOnDisk).ToLower();
return allowedExtensions.Contains(extension);
}
protected void Application_BeginRequest()
{
if (startException != null && Request.RawUrl.ToLower() == "/Error.aspx".ToLower())
{
return;
}
if (startException != null && IsStaticFile(Request))
{
return;
}
if (startException != null && Request.RawUrl.ToLower()!= "/Error.aspx".ToLower())
{
//Response.Redirect("Error.aspx");
Server.Transfer("Error.aspx");
this.Context.AddError(startException);
return;
}
}
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
Server.ClearError();
Server.Transfer("Error.aspx");
}
Pouvez-vous fournir ce que vous avez en ce moment sur votre web.config?
Peut-être que cela peut renvoyer une lumière aspnetreSources.com/articles/customerrorpages