Нет необходимости настраивать маршрут 404.
При запуске глобального asax-приложения установите глобальный фильтр для перехвата 404, если контроллер существует, но отсутствует действие, или если действие возвращает результат 404.
filters.Add(new HttpNotFoundFilterAttribute { Order = 99 });
где фильтр - это атрибут ActionFilterAttribute с этим переопределением:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result !=null &&
(filterContext.Result.GetType() == typeof(HttpNotFoundResult) )
{
//You can transfer to a known route for example
filterContext.Result = new TransferResult(SomeAction, SomeController);
}
}
А также в Application_Error, если не существует контроллера:
Exception ex = Server.GetLastError();
string uri = null;
if (Context != null && Context.Request != null)
{
uri = Context.Request.Url.AbsoluteUri;
}
Exception baseEx = ex.GetBaseException();
var httpEx = ex as HttpException;
if ((httpEx != null && httpEx.GetHttpCode()==404)
|| (uri != null && Context.Response.StatusCode == 404) )
{ /* do what you want. */
//Example: show some known url
Server.ClearError();
Server.TransferRequest(transferUrl);
}
Чтобы избежать обработки 404 для статических ресурсов, вы должны установить SP1 на Windows 7 или Windows 2008 R2 для обновления IIS7 и установить в файле web.config:
...
<modules runAllManagedModulesForAllRequests="false">
...