【问题标题】:.NET MVC or MVCContrib throws Exceptions for non-existent routes?.NET MVC 或 MVCContrib 为不存在的路由抛出异常?
【发布时间】:2011-08-23 16:58:59
【问题描述】:

我想知道这是否是正常行为。我最近在 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 是否正常。有什么办法可以预防吗?

【问题讨论】:

    标签: asp.net-mvc mvccontrib


    【解决方案1】:

    如果请求来自机器人,这与 MVCContrib 无关。只是您使用的是自定义控制器工厂,因此所有请求(甚至是垃圾邮件)都通过该工厂。在您的应用程序代码中,您无能为力。为了阻止这些请求,您可能需要设置防火墙规则来阻止这些请求来自的垃圾邮件域。或者在它们访问 Web 服务器之前根据其他一些规则阻止它们。这是本网站的题外话。

    【讨论】:

    • 对不起MvcContrib.ControllerFactories.IoCControllerFactory与MVCContrib无关?
    • @Chris Nicola,它是一个自定义控制器工厂。这与您的问题无关,即:您的网站正被恶意请求攻击 => 无论您使用的是 ASP.NET、Java、RoR 还是出现相同的问题。
    • 是的,我明白发生了什么,但这与我的问题无关。我的问题是 404 在 .NET 中处理异常是否正常,事实证明所有标准 HTTP 错误都是以这种方式处理的。不过还是谢谢。
    【解决方案2】:

    更仔细地查看 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 并忽略错误非常简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2015-06-27
      • 2021-06-13
      相关资源
      最近更新 更多