Question

NOTE: Je sais que les diverses raisons pour éviter d'utiliser la session, mais c'est un projet que j'ai hérité, donc s'il vous plaît sauter cette partie de réponses:)

Comme il est un problème résolu, j'espère que quelqu'un peut pointer vers une pièce ELMAH / branche / fourche qui comprend l'enregistrement des données de session plutôt que de réinventer la roue.

Une chose bizarre est un ancien poste de Atif qui dit qu'ils sont déjà enregistrés:

http://markmail.org/message/ncmdgwm5rmzewbwu

henningst de commentateur a mentionné l'ajout des variables de session ici:

http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

Une autre approche (je préfère éviter) est de copier les valeurs dans les cookies

http://www.sharpdeveloper.net/content/archive/2008/11/10/how-to-get-session-or-other-custom-values-into-elmah.aspx

Je sais une alternative est de passer à quelque chose en plus ELMAH (comme Exceptioneer - voir http: // exceptioneer. com / public / ExceptioneerAndELMAH.aspx ) mais étant donné que c'est mon seul problème avec ELMAH au moment, je préfère avoir juste un ELMAH patché que de passer à autre chose.

Était-ce utile?

Autres conseils

Au lieu de patcher Elmah, je l'ai fait avec des données d'exception. Dans Global.asax J'ai inséré les données supplémentaires à l'exception sur Application_Error (). « HistoryStack » est ma propre classe pour l'enregistrement historique de l'utilisateur, y compris et bouton onglet clics:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();
    var stack = HistoryStack.Dump(); // essentially grabs data from the session
    ex.Data.Add("historyStack", stack);
}

Ensuite, dans ErrorMail_Mailing () Je saisis les données en arrière et raccordé dans l'e-mail:

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
{
    var stack = e.Error.Exception.Data["historyStack"] as Stack<string>;
    if (stack == null && e.Error.Exception.InnerException != null)
    {
        // could probably skip the first try and go straight to this assignment:
        stack = e.Error.Exception.InnerException.Data["historyStack"] as Stack<string>;
    }

    if (stack != null && stack.Count > 0)
    {
        e.Mail.Body = e.Mail.Body + "<h1>Browsing History</h1>" + System.Environment.NewLine;
        while (stack.Count > 0)
        {
            e.Mail.Body = e.Mail.Body + stack.Pop() + "<br />" + System.Environment.NewLine;
        }
    }
}

Maintenant ces données sont ajoutées au bas de l'e-mail. Aucun patch ou extensions nécessaires.

Le vieux patch qui peut être déterré est malheureusement un peu obsolète avec Elmah maintenant. Voici ce que je l'ai fait pour ouvrir une session variables de session dans la version 2.0.15523.27 Sur la base d'un ancien patch trouvé ici:


Dans ErrorDetailPage.cshtml

Rechercher (à la fin du fichier):

@*
}
*@

Ajouter ci-dessus:

@{
    var sessioncollection = new
    {
        Data = error.SessionVariables,
        Id = "SessionVariables",
        Title = "Session Variables",
    };

    //
    // If the collection isn't there or it's empty, then bail out.
    //

    if (sessioncollection.Data != null && sessioncollection.Data.Count > 0)
    {
        var items =
            from i in Enumerable.Range(0, sessioncollection.Data.Count)
            select new
            {
                Index = i,
                Key = sessioncollection.Data.GetKey(i),
                Value = sessioncollection.Data[i],
            };

        items = items.OrderBy(e => e.Key, StringComparer.OrdinalIgnoreCase);

        <div id="@sessioncollection.Id">

            <h2>@sessioncollection.Title</h2>
            @*
                // Some values can be large and add scroll bars to the page
                // as well as ruin some formatting. So we encapsulate the
                // table into a scrollable view that is controlled via the
                // style sheet.
            *@

            <div class="scroll-view">

                <table cellspacing="0" style="border-collapse:collapse;" class="table table-condensed table-striped">
                    <tr>
                        <th class="name-col" style="white-space:nowrap;">Name</th>
                        <th class="value-col" style="white-space:nowrap;">Value</th>
                    </tr>

                    @foreach (var item in items)
                    {
                        <tr class="@(item.Index % 2 == 0 ? "even" : "odd")">
                            <td class="key-col">@item.Key</td>
                            <td class="value-col">@item.Value</td>
                        </tr>
                    }

                </table>
            </div>
        </div>
    }
}

Après avoir modifié ErrorDetailPage.cshtml dans Visual Studio, faites un clic droit sur le fichier et "Run Custom Tool" pour générer le code pour ErrorDetailPage.generated.cs


Maintenant, vous pouvez construire (je viens d'utiliser le fichier build.cmd qui a été inclus dans le projet) et récupérer les fichiers ddl du bac qui sont nécessaires.

  • AntiXssLibrary.dll
  • Elmah.AspNet.dll
  • Elmah.dll

Vous pouvez également modifier le web.config dans votre projet maintenant d'inclure la version sur toutes les références à Elmah. Si vous utilisez ReSharper, vous pouvez simplement cliquer sur chacun d'eux et de les corriger. (Il y a probablement une autre façon ce qui est censé être fait pour éviter cela, mais je ne suis pas sûr et je n'étais pas trop inquiet pour figurer dehors)

Un exemple de l'un d'eux serait bien en train de changer

<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />

à

<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah.AspNet, Version=2.0.15523.27, Culture=neutral, PublicKeyToken=null" />
scroll top