Мешайте исключению быть брошенными для несуществующего контроллера

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

Я использую 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 файл. Ничто не останавливает это исключения.

Еще раз спасибо за любую справку!

9
задан HotN 10 October 2017 в 10:41
поделиться

3 ответа

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

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

2
ответ дан 3 November 2019 в 04:40
поделиться

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

0
ответ дан 3 November 2019 в 04:40
поделиться

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

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

4
ответ дан 3 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: