带布局的自定义错误页面

我一直在努力让自定义错误页面工作,并继续寻找回到简单使用静态页面的方法。 虽然静态页面有效,但它需要重新构建我们希望在此时避免的导航栏。 我目前正在使用以下内容指定自定义错误页面。

Asp.neterror handling

   

IISerror handling

     

有没有一种方法可以实现动态自定义错误页面,可以处理IIS错误和Asp.net错误?

我在ASP.Net MVC项目中解决了同样的问题,通过处理程序通过.Net来管理所有内容。

              

首先创建一个ErrorController来处理请求错误而没有找到像。

 [AllowAnonymous] public class ErrorController : Controller { // GET: Error public ActionResult NotFound() { Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; Response.TrySkipIisCustomErrors = true; HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; HttpContext.Response.TrySkipIisCustomErrors = true; return View(); } public ActionResult Error() { Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; Response.TrySkipIisCustomErrors = true; return View(); } } 

您会注意到我调用TrySkipIisCustomErrors来尝试避免IIS错误

然后创建一个基本控制器来处理将映射到ErrorController.NotFound操作的所有未知操作。

 public abstract class FrontOfficeControllerBase : Controller { protected override void HandleUnknownAction(string actionName) { var data = ViewData; //Custom code to resolve the view. //ViewResult view = this.View(c => c.NotFound()); //Manually create view with view Data ViewResult view = new ViewResult(); view.ViewData = new ViewDataDictionary(); view.ViewData["controller"] = "Error"; view.ViewData["action"] = "NotFound"; if (data != null && data.Count > 0) { data.ToList().ForEach(view.ViewData.Add); } Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; Response.TrySkipIisCustomErrors = true; view.ExecuteResult(this.ControllerContext); } } 

所有Controllers都将从此基本控制器inheritance。

在所有其他路线之后配置了捕获所有路线。

 routes.MapRoute( name: "404-NotFound", url: "NotFound", defaults: new { controller = "Error", action = "NotFound" } ); routes.MapRoute( name: "500-Error", url: "Error", defaults: new { controller = "Error", action = "Error" } ); routes.MapRoute( name: "CatchAll", url: "{*any}", defaults: new { controller = "Error", action = "NotFound" }); 

这确保了如果路由与我的任何控制器都不匹配,它将安全地路由到ErrorController.NotFound操作。

对于视图,我在Views/Shared文件夹中创建了相应的NotFound.shtmlError.cshtml ,并且他们从访问根布局中受益,这是我认为您正在寻找的。

最后,我能够从web.config删除customErrorshttpErrors ,因为不再需要它们,因为每个请求都由处理程序管理并相应地路由。

这个结构的最初想法来自这篇文章,在那里我混合和匹配可用的选项,直到我找到一个工作/适合我的需求的解决方案。

ASP.NET MVC中的exception处理(解释了6种方法)

希望这可以帮助。

我也在努力解决这个问题并且搜索了很长时间。 据我所知,没有办法创建一个动态自定义错误页面,为未进入.net管道的请求的IIS错误提供服务。 和你一样,我最终有两个404错误页面。 一个动态.aspx用于文件未找到由于进入.net管道的请求而导致的错误,一个.html用于未找到从未进入.net管道的文件未找到的请求。 贬低你的问题的人可能并没有意识到你提出了一个非常好的,也是一个难以解决的问题。 我会提出你的问题,以帮助弥补。