Dzieje się tak dlatego, że trasa domyślna (zakładając, że mieć) nadal będzie pasować do Elmah.Mvc.ElmahController.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
Część trasy "{controller}" znajdzie pasujący kontroler, niezależnie od tego, czy chcesz, czy nie. Jest to oczywiście problematyczne w tym przypadku.
Możesz dodać ograniczenia na trasach, używając narzędzia IRouteConstraint, oznaczonego jako here. Ograniczenie NotEqual jest całkiem przydatne.
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;
}
}
Następnie należy wykluczyć ElmahController z domyślnej trasy, korzystając z następujących.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = new NotEqual("Elmah") });
To sprawi żądania „/ ELMAH” zwróci 404.
Niestety, ale to nie pomogło, nie zmieniając niether wszystkich miejsc, które mówi „elmah.axd” w pliku web.config –
spróbować dodać IgnoreRoute w metodzie RegisterRoutes. W ten sposób MVC nie będzie próbowało obsłużyć żądania: routes.IgnoreRoute ("admin/Elmah.axd"); routes.IgnoreRoute ("admin/Elmah.axd/{* pathInfo}"); routes.IgnoreRoute ("{resource} .axd/{* pathInfo}"); –
Ta poprawka zadziała, ale ja nie chcę łatki, chcę wiedzieć, gdzie jest rejestrowana domyślna trasa i dlaczego jest ona niedostępna po mojej zmianie w web.config –