asp.net-mvc – 为缺少的ASP.Net MVC控制器更正404消息

我有一个MVC 2应用程序,应该总是给出一个“漂亮的”404页面.

但是目前我得到了一个低级别.Net:“’/ sitename’应用程序中的服务器错误…”

我有一个基本控制器,它有一个NotFound动作,将呈现漂亮的404页面.

处理缺失的操作:

protected override void HandleUnknownAction(string actionName)
{
    this.NotFound(actionName).ExecuteResult(this.ControllerContext);
}

因此,访问{site} / ValidController / NotAnAction会被正确路由.

但是访问{site} / NotAController则没有.

我有设置的路线全部:

routes.MapRoute(
    "MVC routes","{controller}/{action}/{id}",new { action = "Index",id = UrlParameter.Optional });

routes.MapRoute(
    "Catch All","{*url}",new { controller = "System",action = "NotFound" });

catch全部正确捕获不匹配的路由.

所以{site} / Invalid / Action / id / extra通过catch all正确路由.

但是{site} / Invalid通过“MVC路由”路由获取并且ASP.Net寻找InvalidController,并在找不到它时抛出一个哑异常.

我知道我可以在web.config级别覆盖它,但这只是重定向页面.我想知道路由模式何时匹配但控制器不是有效的控制器名称.

我在哪里可以捕捉并改变这种行为?

解决方法

我终于找到了答案,虽然它仍然不理想.

您可以使用正则表达式限制允许匹配路由的控制器名称,因此如果我们假设控制器工厂的默认实现,我们可以找出所支持的所有可能的类名:

// build up a list of known controllers,so that we don't let users hit ones that don't exist
var allMvcControllers = 
    from t in typeof(Global).Assembly.GetTypes()
    where t != null &&
        t.IsPublic &&
        !t.IsAbstract &&
        t.Name.EndsWith("Controller",StringComparison.OrdinalIgnoreCase) &&
        typeof(IController).IsAssignableFrom(t)
    select t.Name.Substring(0,t.Name.Length - 10);

// create a route constraint that requires the controller to be one of the reflected class names
var controllerConstraint = new
{
    controller = "(" + string.Join("|",allMvcControllers.ToArray()) + ")"
};

// default MVC route
routes.MapRoute(
    "MVC",id = UrlParameter.Optional },controllerConstraint);

// fall back route for unmatched patterns or invalid controller names
routes.MapRoute(
    "Catch All",action = "NotFound" });

这不是理想的,它增加了应用程序启动的命中,但仍然感觉太复杂,但它确实具有所需的效果.

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...