.NET MVC или MVCContrib выбрасывает исключения для несуществующих маршрутов? - PullRequest
0 голосов
/ 23 августа 2011

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

Я прочитал эту запись , но я определенно скомпилирован в Release, так что, похоже, это не моя проблема.

Вот копия трассировки стека.

[2011-08-23 09:50:56,156] (7) |ERROR| - An unexpected exception occurred during an MVC application request
REQUEST: GET http://XX.XX.XX.XX/pma/scripts/setup.php
--==EXCEPTION (1)==--
TYPE: HttpException
MESSAGE:Could not find a type for the controller name 'pma'
STACKTRACE
   at MvcContrib.ControllerFactories.IoCControllerFactory.CreateController(RequestContext context, String controllerName)
   at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2()
   at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a()
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

В основном это ботнет или что-то в этом роде, но проблема в том, что он пытается найти контроллер для маршрута и выбрасываетисключение.Это нормально для MVC или MVCContrib.Есть ли способ предотвратить это?

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Если присмотреться к коду MvcContrib IoCControllerFactory, я вижу, что, когда controllerType не найден, он делает:

  if (controllerType == null)
    throw new HttpException(404, string.Format("Could not find a type for the controller name '{0}'", (object) controllerName));

Так что, похоже, по замыслу, исключение используется для возврата 404. По крайней мере, насколько я могу судить. На самом деле System.Web.Mvc.DefaultControllerFactory делает то же самое.

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

Редактировать: В качестве решения для регистрации ошибки достаточно просто проверить значение HttpException.GetHttpCode() для 404 и игнорировать ошибку.

0 голосов
/ 23 августа 2011

Если запрос исходит от бота, это не имеет никакого отношения к MVCContrib.Просто вы используете фабрику пользовательских контроллеров, и поэтому все запросы (даже спам) проходят через эту фабрику.В коде приложения вы мало что можете сделать по этому поводу.Чтобы заблокировать эти запросы, вам может потребоваться настроить правила брандмауэра, которые блокируют спам-домены, с которых поступают эти запросы.Или заблокируйте их, основываясь на некоторых других правилах, прежде чем они попадут на веб-сервер.Это не по теме для этого сайта.

...