没有看到您的源代码,我只能做出假设,但我认为 Elmah 停止记录是因为您遇到了异常。这可能是因为Session 属性为空。该会话仅在 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 类都是相同的:错误对象包含我所有的会话变量,我可以以任何方式将它们存储在数据库中想要。