我遇到了一个问题,即解决HTTP错误404.0 - 未找到。我打开了
<customErrors mode="On" defaultRedirect="~/Error/General">
<error statusCode="404" redirect="~/Error/HttpError404" />
<error statusCode="500" redirect="~/Error/HttpError500" />
</customErrors>
在Web.Config中。但问题仍然存在。我也试过这个解决方案(但它永远不会达到这个方法):
protected void Application_Error()
{
var exception = Server.GetLastError();
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "HttpError404";
break;
case 404:
routeData.Values["action"] = "HttpError404";
break;
}
}
IController errorsController = new ErrorController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
提供
这是控制器:
public class ErrorController : Controller
{
public ActionResult HttpError404(string error)
{
ViewData["Title"] = "Sorry, an error occurred while processing your request. (404)";
ViewData["Description"] = error;
return View("Index");
}
public ActionResult HttpError500(string error)
{
ViewData["Title"] = "Sorry, an error occurred while processing your request. (500)";
ViewData["Description"] = error;
return View("Index");
}
public ActionResult General(string error)
{
ViewData["Title"] = "Sorry, an error occurred while processing your request.";
ViewData["Description"] = error;
return this.View();
}
答案 0 :(得分:11)
好的,我找到了一个解决方案,感谢@ alistair-findlay和this website。 这就是web.config现在的样子:
<system.web>
<customErrors mode="On" defaultRedirect="~/Error/General" redirectMode="ResponseRewrite">
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
<clear/>
<error statusCode="404" path="/Error/HttpError404"/>
</httpErrors>
</system.webServer
这是Global.asax.cs:
protected void Application_Error()
{
if (Context.IsCustomErrorEnabled)
ShowCustomErrorPage(Server.GetLastError());
}
private void ShowCustomErrorPage(Exception exception)
{
var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception);
Response.Clear();
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("fromAppErrorEvent", true);
switch (httpException.GetHttpCode())
{
case 403:
routeData.Values.Add("action", "HttpError403");
break;
case 404:
routeData.Values.Add("action", "HttpError404");
break;
case 500:
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "GeneralError");
routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
break;
}
Server.ClearError();
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
最后:
public class ErrorController : Controller
{
public ActionResult HttpError403(string error)
{
ViewBag.Description = error;
return this.View();
}
答案 1 :(得分:1)
您是否实施了ErrorController
来处理customErrors属性中的重定向?在你的情况下,它看起来像这样:
public class ErrorController : Controller
{
public ActionResult General()
{
return View();
}
public ActionResult HttpError404()
{
return View();
}
public ActionResult HttpError500()
{
return View();
}
}
您还需要为Views文件夹中的每个ActionResults实现视图。
在记录错误方面,您需要在Application_Error
事件处理程序中实现此操作,如下所示:
protected void Application_Error()
{
var exception = Server.GetLastError();
var httpException = exception as HttpException;
// Do logging here
}
这是在302重定向到上面ErrorController
中定义的错误页面之前“捕获”错误。