我正在尝试处理错误并显示404、403等相应的页面。
为此,我做了一个ErrorHandling过滤器,它可以按预期工作。即当我尝试要求
mysite.com/Home/random_non-existent_action
用户被重定向到我的自定义404页面并返回404作为响应代码。 401和403同样适用。
我已经通过错误处理过滤器和在web.config上进行的修改来实现了:
这是问题开始的地方,我们的客户也希望自定义IIS的错误页面,例如当我请求时
mysite.com/images,
正在显示IIS错误页面,因为禁用了目录浏览,并且由于在IIS级别上阻止了此浏览,所以我的错误处理过滤器不起作用。
为了覆盖IIS错误页面,我在web.config中添加了以下代码
现在,在我的web.config中同时存在customErrors和httpErrors时,
当我要求
mysite.com/Home/random_non-existent_action
显示了我的自定义404页面(因为IIS绕过了它,并且我的错误处理过滤器起作用了)。但是当我要求
mysite.com/content
要么
mysite.com/images
我收到带有404状态代码的空白回复。
当我将responseMode更改为Redirect(而不是ExecuteURL)时,它可以工作。但是很明显,我正在尝试使用相对路径导航到我的自定义错误页面。
1-当我尝试覆盖IIS自定义错误页面时为什么会收到空白响应?
2-为什么当我使responseMode =“Redirect”而不是responseMode =“ExecuteURL”时起作用
任何帮助将不胜感激,因为我已经搜索了许多类似的stackoverflow主题,但均未成功。
我已经尝试了所有现有的Response和responseMode值组合。除responseMode =“Redirect”之外的任何内容均会使其空白,并带有相应的状态代码。
编辑:
我最后要做的是
编写html内容,然后使用javascript重定向到我的自定义错误页面。
最佳答案
在MVC 5中,我遇到了同样的问题。我解决了在Global.asax处理这些错误的问题。将以下代码放在Global.asax.cs中。
public void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
var routeData = new RouteData();
routeData.Values.Add("area", "");
routeData.Values.Add("controller", "SystemAdministration");
if (exception.GetType() == typeof(HttpException))
{
var code = ((HttpException) exception).GetHttpCode();
if (code == 404)
{
routeData.Values.Add("action", "NotFound");
}
else if (code == 403 || code == 401)
{
routeData.Values.Add("action", "NoAuthorization");
}
else
{
routeData.Values.Add("action", "Index");
routeData.Values.Add("statusCode", code);
}
}
else
{
routeData.Values.Add("action", "Index");
routeData.Values.Add("statusCode", 500);
}
routeData.Values.Add("exception", exception);
Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Response.End();
}
希望这对您有用...
关于asp.net-mvc - ASP.NET MVC自定义错误处理,空白页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637714/