在调用MVC Controller中的方法之前返回响应

时间:2016-04-21 13:07:01

标签: c# asp.net-mvc controller

我在我的基本控制器中做了一些名为“CachingController”的缓存检查(etag)

public CachingController:Controller {
   public CachingController() {
      if (IsKnownEtag(Request.Headers["If-None-Match"])) {
         Response.StatusCode=304;
      }
   }
}

public MyController:CachingController {
  public ActionResult IsMagic(string dragonName) {   
     var isMagic=dragonName=="Puff";
     // ...
     SaveEtag();
     return new ActionResult(isMagic);
  }
}

因此,在我的基本控制器的构造函数中,我检查Etag是否有效。如果是,我想返回状态代码。设置状态代码后,我不希望仍然调用Controller Action。如何在不修改每个动作的情况下执行此操作?

1 个答案:

答案 0 :(得分:2)

将etag逻辑移至ActionFilterAttribute而不是:

public class EtagFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(IsKnownEtag(filterContext.HttpContext.Request.Headers["If-None-Match"]))
        {
            filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.NotModified);
        }
    }

    //...
}

然后在你的控制器中使用它:

public class MyController : CachingController
{
    [EtagFilter]
    public ActionResult IsMagic(string dragonName)
    {
        var isMagic = dragonName == "Puff";
        // ...
        SaveEtag();
        return new ActionResult(isMagic);
    }
}

此外,将SaveEtag()方法移动到过滤器,以便使逻辑远离控制器。