添加ELMAH并更改elmah.mvc.route后,旧路由仍然可用

Ada*_*Tal 8 asp.net-mvc elmah routes web-config asp.net-mvc-4

我已经将ELMAH添加到我的ASP.NET MVC 4 .Net 4 Web应用程序中.

整合很简单,效果很好.

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

但是,由于某些原因,它仍然显示在"/ elmah"(没有css样式,但内容相同).

如何禁用默认的elmah路由?

使用Elmah.MVC nuget包进行集成

wil*_*ers 16

我自己一直在解决这个问题,最新的版本似乎有几个应用程序设置可以很好地为此工作.

<add key="elmah.mvc.IgnoreDefaultRoute" value="true" />
<add key="elmah.mvc.route" value="admin/elmah" />
Run Code Online (Sandbox Code Playgroud)

它可能也值得了解其他人,所以请看一下默认安装.

<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="*" />
Run Code Online (Sandbox Code Playgroud)


小智 9

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

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)

无论您是否想要,路线的"{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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,使用以下内容将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") });
Run Code Online (Sandbox Code Playgroud)

这将使"/ elmah"的请求返回404.