ASP.NET MVC5 Elmah 错误 Log/Email 找不到路径的控制器

ASP.NET MVC5 Elmah Error Log/Email The controller for path was not found

昨天,我将 Elmah 设置为在每次抛出导致我的网站崩溃的未处理异常时向我发送电子邮件。

今天早上,我醒来看到了 6 封邮件,除了:

"System.Web.HttpException: The controller for path '/none' was not found or does not implement IController."

它们来自 Bing 爬虫机器人。还有 2 个来自 Google 和 Yahoo 爬虫机器人。

我检查了我的代码并测试了我网站上的所有链接,没有发现任何错误。我无处尝试路由到 'none' 控制器。其他 2 个错误类似,但指向其他几个控制器,但在我测试时它们工作正常。

我哪里做错了,我怎样才能摆脱这些错误?

我担心他们会降低我网站在搜索引擎中的排名。

更新:

我终于能够重现错误。在我的浏览器中,我输入: "www.mysite.com/abcde." 我网站的自定义 404 错误页面显示哪个好。然而,Elmah 生成了一封电子邮件说

"The controller for path '/abcde' was not found or does not implement IController"

当我输入:"www.mysite.com/Home/abcde" 时,显示了我的自定义 404 错误页面。 Elmah 然后发送了这封电子邮件:

"A public action method 'abcde' was not found on controller 'MySite.Controllers.HomeController'."

这让我得出结论,出于某种原因,网络爬虫蜘蛛正试图访问我网站上已被删除或根本不存在的 URL。

如何让 elmah 不记录来自 URL 我网站上不存在的错误?我不想每次访问者或网络爬虫试图键入不存在的 URL 时都收到一封电子邮件。

另外,有没有办法将最常见的无效网络爬虫 URL(如“/none”和“/error_log”路由到我的主页?

很可能这意味着您页面上的某处有 link 到 "none" - 即您认为仅脚本 link 的东西(带有取消的 click 处理程序默认导航)。修复取决于 link 实际应该做什么,但通常最好让所有 link 指向现有位置,即使它通常由脚本处理。

您可以尝试自己抓取您的网站(使用 HTMLAgilityPack 编写的基本代码或现有的网站扫描工具)以检查是否有 link 未指向正确位置。

经过更多的研究,我解决了我的问题。

步骤如下:

  1. 创建一个实现 IExceptionFilter 接口的 class。让代码检查异常是否得到处理。如果它是那么信号 Elmah。

    public class ElmahHandledErrorLoggerFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            if (context.ExceptionHandled)
                ErrorSignal.FromCurrentContext().Raise(context.Exception);
        }
    }
    
  2. FilterConfig class 的 GlobalFilterCollection 列表中注册 ElmahHandledErrorLoggerFilter 的新实例。注意:这必须在 TransactionFilter 对象之后注册。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new TransactionFilter());
        filters.Add(new ElmahHandledErrorLoggerFilter());
    }
    
  3. 在 Globals.asax.cs 文件中,添加事件处理程序以过滤掉 404 异常。

        protected void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
        {
            FilterError404(e);
        }
    
        protected void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
        {
            FilterError404(e);
        }
    
        // Dismiss 404 errors for ELMAH
        private void FilterError404(ExceptionFilterEventArgs e)
        {
            if (e.Exception.GetBaseException() is HttpException)
            {
                HttpException ex = (HttpException)e.Exception.GetBaseException();
                if (ex.GetHttpCode() == 404)
                    e.Dismiss();
            }
        }
    

    就是这样。现在不会记录或邮寄 404 错误,但所有其他异常将是 logged/mailed.

我会定期使用 Xenu 扫描我的网站以查找损坏的链接。

您可以阅读更多内容Here, Elmah Documentation and Stack Overflow