【问题标题】:After adding ELMAH and changing elmah.mvc.route the old route is still available添加 ELMAH 并更改 elmah.mvc.route 后,旧路由仍然可用
【发布时间】:2013-01-30 09:06:16
【问题描述】:

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

集成很简单,效果很好。

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

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

如何禁用默认的 elmah 路由?

使用Elmah.MVC nuget 包进行集成

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 web-config routes elmah


    【解决方案1】:

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

    <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="*" />
    

    【讨论】:

      【解决方案2】:

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

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

      无论您是否愿意,路由的“{controller}”部分都会找到匹配的控制器。在这种情况下,这显然是有问题的。

      您可以使用 IRouteConstraint 为您的路线添加约束,概述 here。 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。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 抱歉,但这并没有帮助,也没有更改 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 后它仍然存在
        猜你喜欢
        • 2023-02-10
        • 2017-09-26
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        相关资源
        最近更新 更多