我在我的基本控制器中做了一些名为“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。如何在不修改每个动作的情况下执行此操作?
答案 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()
方法移动到过滤器,以便使逻辑远离控制器。