Question

Je me demandais ce que vous pensiez de cette solution, si cela est la bonne façon de passer un message d'erreur à une page personnalisée?

En web.config:

    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>

En Global.asax:

<script RunAt="server">
    void Application_Error(object sender, EventArgs e)
    {
    Exception ex = Server.GetLastError();
    if (ex != null && Session != null)
    {
        ex.Data.Add("ErrorTime", DateTime.Now);
        ex.Data.Add("ErrorSession", Session.SessionID);
        HttpContext.Current.Cache["LastError"] = ex;
    }
    }

</script>

Dans mon Error.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
            if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
                Label1.Text = ex.InnerException.Message;
    }
}

question: Je ne veux pas faire un Server.Transfer de Global.asax parce que .. Je ne sais pas. Semblait maladroit pour moi. Voulez-vous être en mesure de changer customErrors à RemoteOnly. ont ainsi sauver la dernière exception quelque part, mais ne peut pas être session, afin d'économiser à mettre en cache mais avec des données supplémentaires (temps et SessionID) depuis le cache est global et que vous voulez vous assurer que ne pas montrer mauvaise erreur à quelqu'un.


J'ai changé mon code un peu. Maintenant, il suffit:

void Application_Error(object sender, EventArgs e)
{
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
    Server.ClearError();
}

... et ...

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex != null)
            Label1.Text = ex.Message;
    }
}

Remarque SessionID pas là si l'utilisateur anonyme et ex.Data.Add une clé qui est déjà là provoquera une erreur de me faire réaliser qu'il est important d'appeler ClearError

Était-ce utile?

La solution

Je pense que ce d'une façon décente de le faire. Ce n'est pas la façon dont je le fais, mais mon code est trop long pour écrire (et VB.NET).

Une chose que je changerais est la page d'erreur lui-même. Au lieu d'afficher l'erreur, pensez à ajouter une zone de texte à la page d'erreur comme champ facultatif où l'utilisateur peut entrer son adresse e-mail et cliquez sur un bouton pour envoyer le rapport d'erreur à vous. Ensuite, lorsque vous recevez le rapport d'erreur, vous pouvez regarder le problème et y répondre. Il est un moyen de faire beaucoup plus facile à utiliser et il est a très bien fonctionné pour les sites que je l'ai fait sur.

Le long de ces lignes, vous pouvez également recueillir des données de formulaire, les données de session, et rien d'autre de la valeur et de mettre cela dans le rapport d'erreur ainsi. Cela peut rendre le diagnostic beaucoup plus facile des problèmes.

Autres conseils

Nous faisons quelque chose qui peut ou peut ne pas fonctionner pour vous. Nous faisons l'exploitation forestière étendue dans le DB. Lorsque nous obtenons une erreur, nous enregistrons et qui produit un code d'erreur. Nous redirigeons à la page générique avec l'ID d'erreur et d'obtenir les détails là.

Bien sûr, cela tombe à plat sur son visage quand l'erreur est « ne peut pas se connecter à DB », mais cela ne se produit pas trop souvent;)

cache est mondiale ce ne serait pas souhaitable, comme vous avez dit que vous pourriez afficherez la mauvaise erreur à quelqu'un. Je dois aussi dire que vous ne devriez pas émettre le message d'erreur directement aux utilisateurs finaux pour des raisons de sécurité.

Jetez un oeil à cette question:

page d'erreur ASP.NET personnalisé serveur GetLastError est null

Pour résumer quelque chose mis comme suit:

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message)))

Plutôt que de compter sur ASP.NET pour faire la redirection en utilisant les paramètres de la section CustomErrors.

Je suis d'accord avec les deux n8wrl et Steve qu'une meilleure approche serait d'enregistrer les erreurs dans la base de données, puis revenir juste un ID d'erreur à l'utilisateur. Ils ont vraiment ne pas besoin de voir les détails techniques et il est possible que cela exposer des informations sensibles.

Dans notre cas, nous passons également dans l'ID de l'utilisateur (le cas échéant) et la page où l'erreur est survenue (Request.URL est toujours bonne quand vous arrivez à la Application_Error mondiale). De cette façon, nous pouvons traquer l'erreur un peu plus facile. Notez également que vous ne devez pas utiliser Global.asax avec une balise de script. Si vous créez un fichier Global.asax.cs dans votre répertoire App_Code, vous pouvez simplement coder votre C # directement (cela peut dépendre du type de projet, cependant).

Server.ClearError();

Cette ligne doit être placée sur Error.aspx.cs après avoir affiché ErrorMessage je pense.

J'étais en charge de la création d'une page d'erreur personnalisée. Tout était assez simple: dans le fichier web.config j'avais:

<customErrors mode="On">
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1"
</customErrors>

et dans Global.asax, dans le procédé Application_Error: un code ...

Server.Transfer("~/error-pages/error.aspx");

Dans la page d'erreur personnalisée "error.aspx": Server.ClearError();

Je ne sais pas exactement ce qui a été modifié, mais cela n'a pas travaillé plus. Lorsque le code a atteint la méthode Server.Transfer, une exception a toujours été soulevé: Erreur exécution demande de l'enfant pour la page ...

Je regardais des solutions et a finalement trouvé celui-ci. J'ai modifié mon code, et il semble maintenant travailler:

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx">
  <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" />
</customErrors>

et dans le procédé de Global.asax:

Session["LastError"] = Server.GetLastError();

Il a également collaboré avec le cache [ ""] code, mais je la variable préféré session.

Alors, merci pour les réponses.

  • ne pas oublier d'effacer l'erreur dans la page d'erreur personnalisée. C'est important. En outre, il serait indiqué de ne pas montrer exactement toute l'erreur à l'utilisateur. Peut-être dans un certain format convivial. Et donner toutes les informations dans un fichier journal, ou l'envoyer par e-mail ou autre chose.

Espérons que cela a été utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top