Не видя ваш исходный код, я могу только делать предположения, но я думаю, что 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 : объект ошибки содержал все мои переменные сеанса, и я мог сохранять их в базе данных любым способом, каким хотел .