I have an problem cacting the HTTP Error 404.0 - Not Found. I have turned on the
Have you implemented an ErrorController
that handles the redirects in your customErrors attributes? In your case, it would look something like this:
public class ErrorController : Controller
{
public ActionResult General()
{
return View();
}
public ActionResult HttpError404()
{
return View();
}
public ActionResult HttpError500()
{
return View();
}
}
You would also need to implement the views for each of the ActionResults in your Views folder.
In terms of logging the error, you would need to implement this in the Application_Error
event handler as follows:
protected void Application_Error()
{
var exception = Server.GetLastError();
var httpException = exception as HttpException;
// Do logging here
}
This is to "catch" the error before the 302 redirect to your Error pages defined in the ErrorController
above.
Okay i found an solution thanks to @alistair-findlay and this website. This is how the web.config looks like now:
<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
And this is the 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));
}
And lastly:
public class ErrorController : Controller
{
public ActionResult HttpError403(string error)
{
ViewBag.Description = error;
return this.View();
}