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

时间:2016-01-31 23:29:52

标签: c# asp.net-mvc search-engine elmah

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

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

  

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

他们来自Bing爬虫机器人。谷歌和雅虎爬虫机器人还有2个。

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

我做错了什么,如何摆脱这些错误?

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

更新

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

  

“未找到路径'/ abcde'的控制器或未实现IController”

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

  

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

这使我得出结论,由于某些原因,网络抓取工具蜘蛛正在尝试访问我的网站上已删除或从未存在过的网址。

如何让elmah不记录来自我网站上不存在的网址的错误?每次访问者或网络抓取工具尝试键入不存在的网址时,我都不希望收到电子邮件。

此外,有没有办法将最常见,无效的网络抓取工具网址(如“/ none”和“/ error_log”)路由到我的主页?

2 个答案:

答案 0 :(得分:3)

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

以下是步骤:

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

    public class ElmahHandledErrorLoggerFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            if (context.ExceptionHandled)
                ErrorSignal.FromCurrentContext().Raise(context.Exception);
        }
    }
    
  2. ElmahHandledErrorLoggerFilter课程的GlobalFilterCollection列表中注册FilterConfig的新实例。注意:必须在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错误未被记录或邮寄,但所有其他例外将被记录/邮寄。

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

    您可以阅读更多HereElmah DocumentationStack Overflow

答案 1 :(得分:1)

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

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