首页 > 解决方案 > 有没有办法区分特定的 System.Web.HttpException?

问题描述

我有一些“坏男孩”用户使用不存在的控制器调用我的网站。比如www.myapp.com/.svn/, 或www.myapp.com/wp-admin/

该应用程序基本上抛出一个System.Web.HttpException,这ExceptionMessage路径“...”的控制器未找到或未实现 IController。

System.Web.HttpException有没有办法以一种健壮的方式准确地捕捉到这个“子” ?(当然不比较 的字符串ExceptionMessage)。

任何指示确切异常的子 InnerException 类型和/或某些“代码”?

标签: asp.net-mvcexception.net-4.6.1httpexception

解决方案


您可以创建一个自定义IControllerFactory,例如从DefaultControllerFactory.

当无法解析匹配的控制器时,将使用参数的值调用其GetControllerInstance方法。 在这一点上,你领先于.nullcontrollerType
Exception

IController GetControllerInstance(RequestContext requestContext, Type controllerType)

在这里,您决定如何处理请求,例如记录和/或由特定控制器处理请求。

下面的示例显示了如何将ErrorController其用作后备,执行其Index操作方法。

class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            var routeData = requestContext.RouteData;
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = "Index";
            controllerType = typeof(ErrorController);
        }

        return base.GetControllerInstance(requestContext, controllerType);
    }
}

自定义控制器工厂从内部安装,例如Application_Start使用Global.asax.cs

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

请注意,如果控制器确实存在,但操作不存在,这并不能保护您免受相关异常的影响。

例如,给定 aHomeController没有Ufo操作方法,urlwww.myapp.com/home/ufo会导致Exception "A public action method 'ufo' was not found on controller '...HomeController".

处理这种情况的一个简单解决方案是覆盖HandleUnknownAction所有控制器都继承的自定义基本控制器。

下面的示例显示了如何执行共享Error视图 ( Shared\Error.cshtml)。

public abstract class BaseController : Controller
{
    protected override void HandleUnknownAction(string actionName)
    {
        View("Error").ExecuteResult(ControllerContext);
    }
}

推荐阅读