8
votes

Comment atteindre la page Erreurs personnalisée dans ASP.NET lorsque le fournisseur d'Etat de la session est en panne?

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.

É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.

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?


3 commentaires

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


3 Réponses :


1
votes

Ajouter quelque chose comme ceci à votre web.config? XXX

Vous pouvez lire plus d'informations Ici

Si c'est votre SQLSessionState qui échoue, vous devez gérer l'erreur correspondante dans l'événement Application_Error dans global.asax

Vous pouvez lire plus d'informations ici >


8 commentaires

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 dans global.asax


@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.



1
votes

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.

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.

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 ...

mise à jour: Après avoir enquêté sur cela depuis un moment, il apparaît que mon problème provient du fait que la sessionStaTemodule provoque le fournisseur d'État d'appfabrique de la session de cache d'APPABRIC, d'essayer de vous connecter au DataCache (ce qui n'est pas disponible) et une exception (probablement le délai d'attente) est lancée quelque part. Parce que cela se produit dans l'init du module HTTP, il semble ne sembler aucun moyen autour de l'écran jaune de la mort .

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.


3 commentaires

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 . Global.Asax Les gestionnaires d'événements sont exécutés en dernier." [ apprendre.IIS.net/ page.cx / 381 / ... ]



0
votes

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: xxx pré>

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");     
                }


0 commentaires