gpt4 book ai didi

c# - Elmah 抛出 ObjectDisposedException

转载 作者:行者123 更新时间:2023-11-30 15:26:28 25 4
gpt4 key购买 nike

我有一个使用 Windows 身份验证和 Elmah 日志记录在 IIS 7 上运行的 MVC 应用程序。

通常当错误发生时,我们会调用类似“logger.LogError”的东西,它是一个包装器:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception(message)));

我们设置了一个远程系统来运行定期 ping Web 应用程序的作业,以便唤醒它并告诉它运行特定的作业。远程应用程序使用 HttpClient::GetAsync(...) 连接到站点。

远程 ping 命中的页面执行它需要在线程中运行的作业但不等待,因为我们希望 ping 立即响应。不幸的是,这有破坏 Elmah 日志记录的额外缺点。

如果我们在作业执行期间发生任何类型的记录错误,当我们到达“LogError”方法时,Elmah 会抛出一个“ObjectDisposedException”并显示消息“Safe Handle has been closed”(可能是因为尝试访问当前用户身份)。我在调试时查看了 watch 窗口,抛出错误的部分是:

new Elmah.Error(new Exception(message))

如果我只调用“new Elmah.Error()”它工作正常,“new Exception(message)”也工作正常,但是当将异常作为参数传递给错误构造函数时,它就会失败。此外,我无法在创建新的错误对象后分配异常,因为该属性是只读的。

我很确定这是因为当前 Windows 标识在完成时超出了父线程的范围。有没有办法在不等待作业执行的情况下解决这个问题?问题是作业可能需要很长时间才能运行,我们不希望远程 ping 应用在等待响应时超时或挂起很长时间。

最佳答案

以防其他人遇到这个问题,这就是我最终做的事情:

在你通常会打电话的情况下

Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

改为调用此函数:

public static void LogError(Exception ex)
{
if (HttpContext.Current == null)
{
var errorlog = Elmah.ErrorLog.GetDefault(null);
var error = new Elmah.Error();
error.Message = ex.Message;
error.Detail = ex.ToString();
error.Time = DateTime.Now;
error.Type = ex.GetType() + "[NoContext]";
error.HostName = Environment.MachineName;
errorlog.Log(error);
} else {
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
}

注意事项:

  • 所有这一切只是记录到您的默认日志。它不会发送电子邮件或做Elmah 可以用 HttpContext 做的任何其他奇特的事情
  • 您不会看到完整的死机蓝屏 - 只会看到异常的 ToString() 表示,这不太有用。

关于c# - Elmah 抛出 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com