[英]How can I send the HTTP response back to the user but still do more things on the server after that?
[英]How can I end a response and send HTTP code 404 back?
我正在使用城堡windsor工廠根據請求網址實例化一個對象。
就像是:
public FooViewModel Get()
{
if (HttpContext.Current == null)
{
return new FooViewModel();
}
var currentContext = new HttpContextWrapper(HttpContext.Current);
// resolve actual view model.
在某些情況下,我實際上想要拋出404並停止請求,目前如下:
throw new HttpException(404, "HTTP/1.1 404 Not Found");
currentContext.Response.End();
但是請求沒有結束,它仍然命中Action並嘗試解析視圖?
我的控制器看起來像這樣:
public class HomeController : Controller
{
public FooViewModel Foo { get; set; }
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
我覺得這一切都錯了嗎? 或者有沒有辦法實現這一目標?
我想到的另一種選擇是檢查Foo屬性狀態的動作屬性?
我認為使用動作過濾器的方法可以達到你想要的效果:
public class RequiresModelAttribute : ActionFilterAttribute
{
private readonly string _modelName;
public RequiresModelAttribute(string modelName)
{
_modelName = modelName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var property = filterContext.Controller.GetType().GetProperty(_modelName);
var model = property.GetValue(filterContext.Controller);
if (model == null)
{
filterContext.Result = new HttpStatusCodeResult(404);
}
}
}
然后,在您的控制器上,您可以:
public class HomeController : Controller
{
public FooViewModel Foo { get; set; }
[RequiresModel("Foo")]
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
}
編輯:也許使用全局過濾器來兌現任何拋出的HttpExceptions?
public class HonorHttpExceptionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var httpException = filterContext.HttpContext.AllErrors.FirstOrDefault(x => x is HttpException) as HttpException;
if (httpException != null)
{
filterContext.Result = new HttpStatusCodeResult(httpException.GetHttpCode());
}
}
}
然后在Global.asax中:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new HonorHttpExceptionAttribute());
}
另一個選項是覆蓋Controller上的OnException。
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
Get();
return View();
}
public int Get()
{
throw new HttpException(404, "HTTP/1.1 404 Not Found");
// we don't need end the response here, we need go to result step
// currentContext.Response.End();
}
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
if (filterContext.Exception is HttpException)
{
filterContext.Result = this.HttpNotFound(filterContext.Exception.Message);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.