Я хочу вернуть HTTP-статус 404
, если неверные аргументы переданы моему контроллеру. Например, если у меня есть контроллер, который выглядит так:
public ActionResult GetAccount(int id)
{
...
}
Тогда я хочу вернуть 404
, если, скажем, такие URL встречаются:
/GetAccount
/GetAccount/notanumber
т.е. Я хочу поймать брошенного ArgumentException
.
Я знаю, что могу использовать обнуляемый тип:
public ActionResult GetAccount(int? id)
{
if(id == null) throw new HttpException(404, "Not found");
}
Но это довольно неприглядно и скучно.
Я надеялся, что смогу добавить это в мои контроллеры, где это необходимо:
[HandleError(View="Error404", ExceptionType = typeof(ArgumentException))]
public class AccountsController : Controller
{
public ActionResult GetAccount(int id)
{
...
}
}
Но, похоже, это плохо работает.
Я видел этот пост и этот ответ , который почти решает мою проблему:
В этом ответе создается резюме BaseController , из которого вы извлекаете все остальные ваши контроллеры:
public abstract class MyController : Controller
{
#region Http404 handling
protected override void HandleUnknownAction(string actionName)
{
// If controller is ErrorController dont 'nest' exceptions
if (this.GetType() != typeof(ErrorController))
this.InvokeHttp404(HttpContext);
}
public ActionResult InvokeHttp404(HttpContextBase httpContext)
{
IController errorController = ObjectFactory.GetInstance<ErrorController>();
var errorRoute = new RouteData();
errorRoute.Values.Add("controller", "Error");
errorRoute.Values.Add("action", "Http404");
errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
errorController.Execute(new RequestContext(
httpContext, errorRoute));
return new EmptyResult();
}
#endregion
}
Это прекрасно работает при обработке неизвестных действий с 404
, но не позволяет мне обрабатывать недопустимые данные как 404
.
Могу ли я безопасно переопределить Controller.OnException(ExceptionContext filterContext)
вот так:
protected override void OnException(ExceptionContext filterContext)
{
if(filterContext.Exception.GetType() == typeof(ArgumentException))
{
filterContext.ExceptionHandled = true;
this.InvokeHttp404(filterContext.HttpContext);
}
else
{
base.OnException(filterContext);
}
}
На первый взгляд, это похоже на работу, но я накапливаю какие-то проблемы при этом?
Это семантически правильная вещь?