Asp.net mvc 添加ELMAH并更改ELMAH.mvc.route后,旧管线仍然可用

Asp.net mvc 添加ELMAH并更改ELMAH.mvc.route后,旧管线仍然可用,asp.net-mvc,asp.net-mvc-4,web-config,routes,elmah,Asp.net Mvc,Asp.net Mvc 4,Web Config,Routes,Elmah,我已将ELMAH添加到我的ASP.NETMVC4.NET4Web应用程序中 整合很简单,效果也很好 我已将我的web.config的应用程序设置中的“elmah.mvc.route”值更改为“Admin/SiteLog”路由-elmah日志现在显示在此路由中 但是,出于某种原因,它仍然显示在“/elmah”(没有css样式,但内容相同) 如何禁用默认的elmah路由 集成是使用nuget包进行的您可以通过更新web.config的httpHandlers部分中的路径来指定位置 <h

我已将ELMAH添加到我的ASP.NETMVC4.NET4Web应用程序中

整合很简单,效果也很好

我已将我的web.config的应用程序设置中的“elmah.mvc.route”值更改为“Admin/SiteLog”路由-elmah日志现在显示在此路由中

但是,出于某种原因,它仍然显示在“/elmah”(没有css样式,但内容相同)

如何禁用默认的elmah路由


集成是使用nuget包进行的

您可以通过更新web.config的
httpHandlers
部分中的路径来指定位置

    <httpHandlers>
        <add verb="POST,GET,HEAD" path="admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
    </httpHandlers>

发生这种情况是因为默认路由(假设您有一条)仍将与Elmah.Mvc.ElmahController匹配

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional });
路由的“{controller}”部分将找到匹配的控制器,无论您是否希望它。在这种情况下,这显然是有问题的

您可以使用IRouteConstraint(概述)在管线上添加约束。NotEqual约束实际上非常有用

using System;
using System.Web;
using System.Web.Routing;

public class NotEqual : IRouteConstraint
{
    private string _match = String.Empty;

    public NotEqual(string match)
    {
        _match = match;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return String.Compare(values[parameterName].ToString(), _match, true) != 0;
    }
}
因此,请使用以下命令将ElmahController从默认路由中排除

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { controller = new NotEqual("Elmah") });

这将使请求“/elmah”返回404。

我自己刚刚解决了这个问题,最新版本似乎有几个应用程序设置可以很好地解决这个问题

<add key="elmah.mvc.IgnoreDefaultRoute" value="true" />
<add key="elmah.mvc.route" value="admin/elmah" />

它可能也值得注意其他一些,所以请注意默认安装

<add key="elmah.mvc.disableHandler" value="false" />
<add key="elmah.mvc.disableHandleErrorFilter" value="false" />
<add key="elmah.mvc.requiresAuthentication" value="false" />
<add key="elmah.mvc.allowedRoles" value="*" />
<add key="elmah.mvc.allowedUsers" value="*" />


很抱歉,但这没有帮助,niether确实更改了web.config文件中显示“elmah.axd”的所有位置,并尝试在RegisterRoutes方法中添加IgnoreRoute。这样,MVC就不会尝试处理请求:routes.IgnoreRoute(“admin/Elmah.axd”);routes.IgnoreRoute(“admin/Elmah.axd/{*pathInfo}”);routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);这个补丁可以工作,但我不想要补丁,我想知道它在哪里注册默认路由,以及为什么在我在web.config中更改后它仍然存在