其他分享
首页 > 其他分享> > 埃尔玛抛出ObjectDisposedException

埃尔玛抛出ObjectDisposedException

作者:互联网

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

通常,当发生错误时,我们会调用“ logger.LogError”之类的东西作为包装:

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

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

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

如果在作业执行过程中发生任何类型的记录错误,则进入“ LogError”方法时,Elmah会抛出“ ObjectDisposedException”,并显示消息“安全手柄已关闭”(可能由于尝试访问当前对象而冒泡用户身份).我在调试时在监视窗口中检查了一下,引发错误的部分是:

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()表示形式,它用处不大.

标签:multithreading,elmah,windows-identity,c
来源: https://codeday.me/bug/20191028/1952789.html