Frage

HINWEIS: Ich kenne die verschiedenen Gründe, um die Sitzung zu vermeiden, aber dies ist ein Projekt, das ich geerbt habe. Bitte überspringen Sie also diesen Teil aller Antworten :)

Da es sich um ein gelöstes Problem handelt, hoffe ich, dass jemand auf einen Elmah Patch/Zweig/Gabel verweisen kann, der Protokollierungssitzungsdaten enthält, anstatt das Rad neu zu erfinden.

Eine seltsame Sache ist ein älterer Beitrag von ATIF, der besagt, dass sie bereits protokolliert sind:

http://markmail.org/message/ncmdgwm5rmzewbwu

Kommentator Henningst erwähnte, dass die Sitzungsvariablen hier hinzugefügt wurden:

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

Ein anderer Ansatz (ich vermeide es lieber) ist das Kopieren der Werte in Cookies

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

Ich weiß http://exceptioner.com/public/excepteerandelmah.aspx) Aber da dies im Moment mein einziges Problem mit Elmah ist, hätte ich lieber nur eine gepatchte Elmah, als auf etwas anderes zu wechseln.

War es hilfreich?

Lösung

Atif antwortete auf Twitter, dass es keinen bekannten Patch gibt:

http://twitter.com/rabof/statuss/7229453423

Also habe ich einen Patch erstellt, der dies tut:

http://twitter.com/Manningj/statuss/7231616905

http://blog.sublogic.com/2009/12/patch-to-nable-session-variable-logging-with-elmah/

Andere Tipps

Anstatt Elmah zu patchen, habe ich dies mit Ausnahmedaten gemacht. In Global.asax habe ich die zusätzlichen Daten in die Ausnahme auf application_error () eingefügt. "HistoryStack" ist meine eigene Klasse zum Aufnehmen von Benutzerverlauf, einschließlich der Schaltfläche und der Registerkarte Klicks:

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

In erarmail_mailing () habe ich dann die Daten zurückgegriffen und sie in der E -Mail angehängt:

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

Jetzt werden diese Daten am Ende der E -Mail angehängt. Keine Patches oder Erweiterungen erforderlich.

Der alte Patch, der ausgegraben werden kann, ist jetzt leider ein wenig veraltet mit Elmah. Hier ist, was ich getan habe, um Sitzungsvariablen in Version 2.0.15523.27 basierend auf einem hier gefundenen älteren Patch zu protokollieren: https://storage.googleapis.com/google-code-attachments/elmah/issue-12/comment-5/elmah-sessionvariables.patch

In fehler.cs

Import System.Web.SessionState

using System.Web.SessionState;

Finden:

private NameValueCollection _serverVariables;
private NameValueCollection _queryString;
private NameValueCollection _form;
private NameValueCollection _cookies;

Fügen Sie unten hinzu:

private NameValueCollection _sessionVariables;

Finden:

_serverVariables = CopyCollection(request.ServerVariables);
_queryString = CopyCollection(qsfc.QueryString);
_form = CopyCollection(qsfc.Form);
_cookies = CopyCollection(qsfc.Cookies);

Fügen Sie unten hinzu:

_sessionVariables = CopyCollection(context.Session);

Finden:

public NameValueCollection Cookies 
{
    get { return FaultIn(ref _cookies); }
}

Fügen Sie unten hinzu:

/// <summary>
/// Gets a collection representing the session variables captured as part of the diagnostic data
/// </summary>

public NameValueCollection SessionVariables
{
    get { return FaultIn(ref _sessionVariables); }
}

Finden:

copy._serverVariables = CopyCollection(_serverVariables);
copy._queryString = CopyCollection(_queryString);
copy._form = CopyCollection(_form);
copy._cookies = CopyCollection(_cookies);

Fügen Sie unten hinzu:

copy._sessionVariables = CopyCollection(_sessionVariables);

Finden:

private static NameValueCollection CopyCollection(NameValueCollection collection)

Fügen Sie oben hinzu:

private static NameValueCollection CopyCollection(HttpSessionStateBase sessionVariables)
{
    if (sessionVariables == null || sessionVariables.Count == 0)
        return null;

    var copy = new NameValueCollection(sessionVariables.Count);

    for (int i = 0; i < sessionVariables.Count; i++)
        copy.Add(sessionVariables.Keys[i], sessionVariables[i].ToString());

    return copy;
}

In errorjson.cs

Finden:

Member(writer, "queryString", error.QueryString);
Member(writer, "form", error.Form);
Member(writer, "cookies", error.Cookies);

Fügen Sie unten hinzu:

Member(writer, "sessionVariables", error.SessionVariables);

In errorsxml.cs

Finden:

case "form"            : collection = error.Form; break;
case "cookies"         : collection = error.Cookies; break;

Fügen Sie unten hinzu:

case "sessionVariables": collection = error.SessionVariables; break;

Finden:

WriteCollection(writer, "form", error.Form);
WriteCollection(writer, "cookies", error.Cookies);

Fügen Sie unten hinzu:

WriteCollection(writer, "sessionVariables", error.SessionVariables);

In erarmailHtmlpage.cshtml

Finden:

<p>@(RenderPartial<PoweredBy>())</p>

Fügen Sie oben hinzu:

@foreach (var collection in 
    from collection in new[] 
    {
        new
        {
            Id    = "SessionVariables",
            Title = "Session Variables",
            Items = error.SessionVariables,
        }
    }
    let data = collection.Items
    where data != null && data.Count > 0
    let items = from i in Enumerable.Range(0, data.Count)
        select KeyValuePair.Create(data.GetKey(i), data[i])
    select new
    {
        collection.Id, 
        collection.Title,
        Items = items.OrderBy(e => e.Key, StringComparer.OrdinalIgnoreCase)
    }
    )
{
    <div id="@collection.Id">
        <h1>@collection.Title</h1>
        <table class="collection">
            <tr><th>Name</th>            
                <th>Value</th></tr>
            @foreach (var item in collection.Items)
            {
                <tr><td>@item.Key</td>
                    <td>@item.Value</td></tr>
            }
        </table>
    </div>
}

Nachdem Sie Änderungen an errormailhtmlpage.cshtml in Visual Studio vorgenommen haben


In errordetailpage.cshtml

Finden Sie (am Ende der Datei):

@*
}
*@

Fügen Sie oben hinzu:

@{
    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>
    }
}

Nachdem Sie Änderungen an errordetailpage.cshtml in Visual Studio vorgenommen haben


Jetzt können Sie erstellen (ich habe gerade die im Projekt enthaltene Build.cmd -Datei verwendet) und die DDL -Dateien aus Bin abgerissen, die benötigt werden.

  • Antixsslibrary.dll
  • Elmah.aspnet.dll
  • Elmah.dll

Möglicherweise müssen Sie das Web.config in Ihrem Projekt jetzt auch ändern, um die Version in alle Verweise auf Elmah aufzunehmen. Wenn Sie Resharper verwenden, können Sie einfach auf jeweils auf diese klicken und sie beheben. (Es gibt wahrscheinlich eine andere Art und Weise, wie dies getan werden soll, um dies zu vermeiden, aber ich bin mir nicht sicher und ich war mir nicht so besorgt darüber, es herauszufinden.)

Ein Beispiel für einen von ihnen würde sich jedoch ändern

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

zu

<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah.AspNet, Version=2.0.15523.27, Culture=neutral, PublicKeyToken=null" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top