Добавьте переменную сеанса или настраиваемое поле в таблицу журнала ошибок Elmah - PullRequest
3 голосов
/ 21 апреля 2010

Я хочу добавить свою собственную переменную сеанса в таблицу журнала ошибок elmah и отобразить ее.Я уже изменил исходный код и добавил новые поля в Error.cs и другие поля, но я не знаю, но когда я назначаю значение HttpContext.Current.Session ["MyVar"]. Tostring () для моего поля вконструктор останавливает запись исключений и не регистрирует никаких исключений.

Мне просто нужно получить значение переменной сеанса. Есть ли другой способ для этого?Я прочитал сообщение, в котором он добавил поля для электронной почты, но там не сказано, где именно я должен получить значение сеанса.Я также читал, что сеансы и файлы cookie по умолчанию регистрируются Elmah, но я не знаю, как получить к ним доступ. Спасибо всем за помощь.

Ответы [ 2 ]

2 голосов
/ 23 мая 2010

Не видя ваш исходный код, я могу только делать предположения, но я думаю, что Elmah перестает регистрировать, потому что вы получаете исключение. Это может произойти, потому что свойство Session имеет значение null. Сеанс доступен только после события PostAcquireRequestState, поэтому вы не можете рассчитывать на то, что это свойство будет всегда доступно.

Я сам попробовал это и написал такой метод:

private static Dictionary<string, object> CopySession(HttpSessionState session)
{
    if (session == null || session.Count == 0)
        return null;

    Dictionary<string, object> copy = new Dictionary<string, object>(session.Count);
    foreach (var key in session.Keys)
    {
        string name = key.ToString();
        copy.Add(name, session[name]);
    }

    return copy;
}

Я вызываю этот метод в конструкторе класса Error следующим образом:

// _session is a new field that I added like this:
// private Dictionary<string, object> _session;
_session = CopySession(context.Session);

(сразу после копирования серверных переменных и прочего контекста. Возможно, вам потребуется изменить реализацию IClonable, чтобы скопировать также поле _session.)

В моих тестах это работает как положено. Я проверил только в классе SqlErrorLog, но это будет то же самое для всех других классов ErrorLog : объект ошибки содержал все мои переменные сеанса, и я мог сохранять их в базе данных любым способом, каким хотел .

0 голосов
/ 20 мая 2010

Я не использовал его, но об этом спрашивали раньше, и, очевидно, есть патч , вы можете попробовать это.

...