【问题标题】:Elmah Does not email in a fire and forget scenarioElmah 在火灾中不发送电子邮件并忘记场景
【发布时间】:2014-04-09 20:28:46
【问题描述】:

我有一个 MVC 应用程序,我试图在 ActionFilter 中捕获所有传入请求。这是日志记录代码。我正在尝试登录火灾并忘记模型。

我的问题是,如果我通过取出 Task.Run 同步执行此代码,Elmah 确实会发送一封电子邮件。但是对于下面显示的代码,我可以看到错误被记录到 elmah.axd 中的 InMemory 记录器,但没有电子邮件。

public void Log(HttpContextBase context)
        {
             Task.Run(() =>
            {
                try
                {
                    throw new NotImplementedException(); //simulating an error condition
                    using (var s = _documentStore.OpenSession())
                    {
                        s.Store(GetDataToLog(context));
                        s.SaveChanges();
                    }

                }
                catch (Exception ex)
                {
                    ErrorSignal.FromCurrentContext().Raise(ex);
                }
            });
        }

【问题讨论】:

  • 我在您的代码中没有看到您发送电子邮件的任何地方。您是否在 GetDataToLog() 方法中这样做?如果您是,我们可能还需要查看该代码。
  • 我正在寻找关于使用 Elmah 错误信号的 catch 块中的代码的帮助。日志记录发生在 nosql 数据存储中。
  • 你没有解决我的问题。您的问题是没有发送电子邮件。我的问题是您的代码中没有任何地方可以发送电子邮件。
  • 我正在使用 ELMAH 进行错误记录/通知。 Elmah 是配置驱动的。记录器在 web.config 中配置。在登录到不同配置接收器的应用程序代码中,我只需要执行此 ErrorSignal.FromCurrentContext().Raise(ex);它回答了你的问题吗?
  • 所以如果我理解正确的话,ErrorSignal.FromCurrentContext().Raise(ex); 应该发送电子邮件?

标签: elmah


【解决方案1】:

从 ELMAH 谷歌组的 Atif Aziz(ELMAH 主要贡献者)那里得到了这个答案:

当您使用Task.Run 时,HttpContext 不会转移到您的操作将在其上执行的线程池线程。当 ErrorSignal.FromCurrentContext 在您的操作中被调用时,我的猜测是它可能因另一个异常而失败,因为没有当前上下文。该例外与任务有关。如果您使用的是 .NET 4,那么您很幸运,因为您最终会看到 ASP.NET 应用程序崩溃(但可能是事后很久),此时 GC 将启动并收集任务,并且其异常将“未观察到” ”。如果您使用的是 .NET 4.5,则策略已更改,异常将丢失。无论哪种方式,您的观察结果都是邮件无法正常工作。事实上,除非您使用允许空上下文的Elmah.ErrorLog.GetDefault(null).Log(new Error(ex)),否则日志记录也不起作用。但该调用仅记录错误,但不发送任何邮件。 ELMAH 的模块连接到 ASP.NET 上下文。如果您通过分叉到另一个线程来脱离该上下文,那么您不能依赖 ELMAH 的模块。您只能可靠地使用Elmah.ErrorLog.GetDefault(null).Log(new Error(ex)) 来记录错误。

【讨论】:

  • 嗨 kolhapuri .. 有什么办法可以解决这个问题吗?我的意思是收到错误邮件
猜你喜欢
  • 2020-03-26
  • 2013-04-04
  • 2016-08-31
  • 2015-10-21
  • 1970-01-01
  • 2010-09-07
  • 2013-02-10
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多