我想知道这是否是正常行为。我最近在Application_Error中添加了日志记录 方法,我看到每当遇到不存在的路线时都会记录异常。这显然不是特例,当然也不利于性能和其他原因。
我读了这个post,但我肯定在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来说这是正常的吗?有没有办法阻止它?
答案 0 :(得分:0)
如果请求来自机器人,这与MVCContrib无关。只是您正在使用自定义控制器工厂,所以所有请求(甚至是垃圾邮件)都要通过该工厂。您可以在应用程序代码中做很多事情。为了阻止这些请求,您可能需要设置阻止这些请求来自的垃圾邮件域的防火墙规则。或者在它们到达Web服务器之前根据其他规则阻止它们。这是该网站的主题。
答案 1 :(得分:0)
更仔细地查看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完全相同。
无论如何,大多数情况下这都回答了我的问题,但是如果有人比我更聪明可以提供更多的洞察力,我会把它打开一段时间。
编辑:作为记录错误的解决方案,检查404的HttpException.GetHttpCode()
值并忽略错误非常简单。