Остановить исключение для несуществующего контроллера - PullRequest
9 голосов
/ 26 июня 2010

Хорошо, поэтому я озадачен этим вопросом.Я видел много вещей, которые должны решить эту проблему, но я не получаю решение, которое может удовлетворить мои требования.

Я использую ELMAH для регистрации исключений и получаю это исключение, когда либо URL-адресс неверным контроллером или соответствующим контроллером и недопустимым действием.

System.Web.HttpException: The controller for path '/BadController' was not found or does not implement IController.
   at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
   at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
   at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Я хочу, чтобы это исключение не выдавалось.Я использую пользовательские ошибки, и они отлично работают, так как приложение отправит на мою страницу ошибки 404.Тем не менее, исключение все еще регистрируется.

У меня есть атрибут [HandleError], украшающий все контроллеры.Это возможно?И если так, то я был бы признателен за любую помощь.

Я пытался установить окончательный маршрут, который перенаправляет , но по какой-либо причине он соответствует маршруту, предшествующему этому.Я попытался использовать httpModule и очистить событие Application_Error файла Global.asax.Ничто не мешает этим исключениям.

Еще раз спасибо за любую помощь!

Ответы [ 4 ]

4 голосов
/ 09 июля 2010

Создайте RouteConstraint, который проверяет, существует ли контроллер (фактически, сканирует все возможные контроллеры в начале и кэширует его, вы понимаете, о чем я) и добавьте его в свой стандартный маршрут.

поэтому, когда у вас появляется запрос к плохому контроллеру, он не принимается обычным маршрутом. но затем принята на всеобщее обозрение -> 404 маршрута ...

2 голосов
/ 26 июня 2010

Подключите фабрику пользовательских контроллеров, которая может выполнять нужные функции, когда не удается найти запрошенный контроллер. Это всего лишь несколько строк кода, ничего страшного.

Вы можете запустить свою собственную фабрику контроллеров или использовать одну из множества библиотек в качестве отправной точки. У вас будет класс, который реализует IControllerFactory, а внутри функции CreateController () будет ваша пользовательская логика.

1 голос
/ 08 сентября 2010

Скорее всего, неправильно передал мою проблему, после того, как тонны копаний вокруг этого исключения должны быть выброшены. Ответ состоит в том, чтобы исключить эти исключения из ELMAH, согласно этой статье .

По умолчанию ELMAH регистрирует детали каждое необработанное исключение, в том числе 404 и другие ошибки HTTP. Вы можете поручить ELMAH игнорировать эти или другие типы ошибок с использованием ошибок фильтрация.

0 голосов
/ 26 июня 2010

Я использую ITOoud Contrib DSO .Ничего из этого {controller}/{action} общих параметров.Явные UrlRoute атрибуты для каждого метода действия.Мне нравится видеть ограничения параметров непосредственно над методом.

...