ASP.NET MVC5 Elmah 错误日志/电子邮件 找不到路径的控制器

本文关键字:找不到 电子邮件 路径 控制器 日志 NET MVC5 Elmah 错误 ASP | 更新日期: 2023-09-27 18:32:49

昨天,我设置了Elmah,每次抛出导致我的网站崩溃的未处理异常时都会给我发送电子邮件。

今天早上,我醒来,看到了 6 封电子邮件,但有例外:

"System.Web.HttpException:找不到路径'/none'的控制器或未实现IController。

它们来自必应爬虫机器人。 还有 2 个来自谷歌和雅虎爬虫机器人。

我已经浏览了我的代码并测试了我网站上的所有链接,没有发现任何错误。我无法尝试路由到"无"控制器。 其他 2 个错误相似,但指向其他几个控制器,但当我测试它们时它们工作正常。

我做错了什么,我怎样才能摆脱这些错误?

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

更新:

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

">

找不到路径"/abcde"的控制器或未实现 IController">

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

"在控制器'MySite.Controllers.HomeController'上找不到公共操作方法'abcde'。

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

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

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

ASP.NET MVC5 Elmah 错误日志/电子邮件 找不到路径的控制器

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

以下是步骤:

  1. 创建实现 IExceptionFilter 接口的类。 检查代码以查看是否处理了异常。 如果是那么信号艾尔玛。

    public class ElmahHandledErrorLoggerFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            if (context.ExceptionHandled)
                ErrorSignal.FromCurrentContext().Raise(context.Exception);
        }
    }
    
  2. FilterConfig 类的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 错误,但将记录/邮寄所有其他异常。

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

你可以在这里阅读更多,Elmah文档和堆栈溢出。

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

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