سؤال

ملاحظة: أعرف الأسباب المختلفة لتجنب استخدام الجلسة ، ولكن هذا مشروع ورثته ، لذا يرجى تخطي هذا الجزء من أي ردود :)

نظرًا لأن مشكلة حلها ، آمل أن يتمكن شخص ما من الإشارة إلى تصحيح/فرع/شوكة Elmah يتضمن بيانات جلسة التسجيل بدلاً من إعادة اختراع العجلة.

شيء واحد غريب هو منشور أقدم من ATIF يقول إنهم تم تسجيلهم بالفعل:

http://markmail.org/message/ncmdgwm5rmzewbwu

ذكر المعلق Henningst إضافة في متغيرات الجلسة هنا:

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

نهج آخر (أفضل تجنب) هو نسخ القيم إلى ملفات تعريف الارتباط

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

أعلم أن أحد البديل هو التبديل إلى شيء إلى جانب Elmah (مثل الاستثناء - انظر http://exceptioneer.com/public/exceptioneerandelmah.aspx) ولكن نظرًا لأن هذه مشكلتي الوحيدة مع Elmah في الوقت الحالي ، فأنا أفضل أن أحصل على Elmah مصححة بدلاً من التحول إلى شيء آخر.

هل كانت مفيدة؟

المحلول

أجاب Atif على Twitter ليقول إنه لا يوجد تصحيح معروف:

http://twitter.com/raboof/statuses/7229453423

لذلك قمت بإنشاء رقعة تفعل ذلك:

http://twitter.com/manningj/statuses/7231616905

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

نصائح أخرى

بدلاً من تصحيح Elmah ، فعلت هذا مع بيانات الاستثناء. في Global.asax ، قمت بإدراج البيانات الإضافية في الاستثناء على application_error (). "HistoryStack" هو صفي الخاص لتسجيل سجل المستخدم ، بما في ذلك النقرات الزر وعلامة التبويب:

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

بعد ذلك ، في errormail_mailing () ، أمسك البيانات مرة أخرى وألحقتها في البريد الإلكتروني:

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

الآن يتم إلحاق هذه البيانات في أسفل البريد الإلكتروني. لا بقع أو امتدادات ضرورية.

التصحيح القديم الذي يمكن حفره هو للأسف عفا عليه الزمن مع Elmah الآن. إليك ما فعلته لتسجيل متغيرات الجلسة في الإصدار 2.0.15523.27 استنادًا إلى تصحيح أقدم موجود هنا: https://storage.googleapis.com/google-code-attachments/elmah/issue-12/comment-5/elmah-sentvariables.patch

in error.cs

استيراد System.Web.SessionState

using System.Web.SessionState;

تجد:

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

اضف الى الاسفل:

private NameValueCollection _sessionVariables;

تجد:

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

اضف الى الاسفل:

_sessionVariables = CopyCollection(context.Session);

تجد:

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

اضف الى الاسفل:

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

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

تجد:

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

اضف الى الاسفل:

copy._sessionVariables = CopyCollection(_sessionVariables);

تجد:

private static NameValueCollection CopyCollection(NameValueCollection collection)

أضف أعلاه:

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

في errorjson.cs

تجد:

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

اضف الى الاسفل:

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

في errorxml.cs

تجد:

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

اضف الى الاسفل:

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

تجد:

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

اضف الى الاسفل:

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

في errormailhtmlpage.cshtml

تجد:

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

أضف أعلاه:

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

بعد إجراء تغييرات على errormailhtmlpage.cshtml في Visual Studio ، انقر بزر الماوس الأيمن على الملف و "تشغيل أداة مخصصة" لإنشاء الكود لـ errormailhtmlpage.generated.cs


في errordetailpage.cshtml

البحث (في نهاية الملف):

@*
}
*@

أضف أعلاه:

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

بعد إجراء تغييرات على errordetailpage.cshtml في Visual Studio ، انقر بزر الماوس الأيمن على الملف و "تشغيل أداة مخصصة" لإنشاء الكود لـ errordetailpage.generated.cs


يمكنك الآن الإنشاء (لقد استخدمت للتو ملف Build.cmd الذي تم تضمينه في المشروع) والاستيلاء على ملفات DDL من Bin المطلوب.

  • antixsslibrary.dll
  • elmah.aspnet.dll
  • المسح

قد تضطر أيضًا إلى تعديل web.config في مشروعك الآن لتضمين الإصدار على أي إشارات إلى Elmah. إذا كنت تستخدم Resharper ، فيمكنك فقط النقر على كل من هذه وإصلاحها. (من المحتمل أن يكون هناك طريقة مختلفة من المفترض أن يتم ذلك لتجنب ذلك ، لكنني لست متأكدًا ولم أكن قلقًا جدًا بشأن معرفة ذلك)

مثال على واحد منهم على الرغم من أن يتغير

<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" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top