asp.net-mvc - 有没有办法区分特定的 System.Web.HttpException?
问题描述
我有一些“坏男孩”用户使用不存在的控制器调用我的网站。比如www.myapp.com/.svn/
, 或www.myapp.com/wp-admin/
。
该应用程序基本上抛出一个System.Web.HttpException
,这ExceptionMessage
:路径“...”的控制器未找到或未实现 IController。
System.Web.HttpException
有没有办法以一种健壮的方式准确地捕捉到这个“子” ?(当然不比较 的字符串ExceptionMessage
)。
任何指示确切异常的子 InnerException 类型和/或某些“代码”?
解决方案
您可以创建一个自定义IControllerFactory
,例如从DefaultControllerFactory
.
当无法解析匹配的控制器时,将使用参数的值调用其GetControllerInstance
方法。
在这一点上,你领先于.null
controllerType
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);
}
}
推荐阅读
- meshlab - 如何更改meshlab中选定顶点的RGB值?
- python - 使用已经存在的保存变量创建 Pandas 数据框?
- c# - Linq to Entity with custom method in Where
- html - 在 Angular 8 中使用共享组件进行延迟加载
- python - 从 Django 页面更新静态 JSON 文件
- gmail - 我如何使用 g-suite 自动签名的代码?
- c# - 如何调整datagridview单元格中的图像大小
- webi - 在 Webi 中查询最近的上一个值
- javascript - 如何使用 jQuery 定位正文中的第一个段落标签
- python - 仅在 Linux 中与 TDK-Lambda ZUP 的串行 RS485 / RS232 通信非常慢