我想玩动作过滤器创建并实现ETag的动作过滤器,并从mvc 4模板中缓存HomeController 10秒钟。
这是我的属性:
public class EtagFilterAttribute : ActionFilterAttribute
{
private DateTime _currentTime = DateTime.Now;
private string _currentEtag = string.Empty;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var httpContext = filterContext.RequestContext.HttpContext;
string eTag = httpContext.Request.Headers["ETag"];
string responseETag = GetEtag();
if (!string.IsNullOrEmpty(eTag))
{
if (eTag.Equals(responseETag))
{
filterContext.HttpContext.Response.StatusCode = 304;
filterContext.HttpContext.Response.StatusDescription = "Not Modified";
}
return;
}
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
filterContext.HttpContext.Response.AddHeader("ETag", responseETag);
filterContext.HttpContext.Response.Cache.SetETag(responseETag);
}
private string GetEtag()
{
if (_currentTime <= DateTime.Now.AddSeconds(10))
{
return _currentEtag;
}
_currentEtag = GenerateEtag();
return _currentEtag;
}
private string GenerateEtag()
{
return Guid.NewGuid().ToString().Substring(0, 20);
}
}
这是HomeController:
public class HomeController : Controller
{
[EtagFilter]
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
[EtagFilter]
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
[EtagFilter]
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
它已编译并运行但在Chrome开发者工具Network-&gt; Headers选项卡中我看不到ETag:
请求网址:http://:1772 /主页/关于请求方法:获取状态 代码:200 OK请求Headersview源 接受:text / html的,应用/ XHTML + xml的,应用/ XML; Q = 0.9, / 的; Q = 0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 连接:保持活跃 饼干:__ RequestVerificationToken = q0yQrf5ee5bsOW-1OXKK754FeRZM89uNQQ1rvN2cVRXaHsPGhOTt2zw2cUyfmu-0uZGLL5-EBS-iJH1-RQ3Q7qb6z4jTHNY8yGJQ3KBYhRs1 主持人:localhost:1772 Referer:http://:1772 / User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36 (KHTML,像Gecko一样)Chrome / 29.0.1547.76 Safari / 537.36响应 Headersview源Cache-Control:私有内容编码:gzip 内容长度:956内容类型:text / html; charset = utf-8日期:星期五,04 2013年10月15:34:02 GMT服务器:Microsoft-IIS / 8.0变化:接受编码 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:4.0 X-已启动方式:ASP.NET X-SourceFiles:????= UTF-8乙ZDpcTXlEb2N1bWVudHNcR2VuZXJhbFxDI1wuTmV0IE1lbnRvcmluZyBQcm9ncmFtXEhUVFBcRXhhbXBsZVxIdHRwRm9yRGV2ZWxvcGVyc1xIb21lXEFib3V0 =
你能告诉我哪里弄错了吗?
答案 0 :(得分:0)
这有效:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var httpContext = filterContext.RequestContext.HttpContext;
string eTag = httpContext.Request.Headers["ETag"];
string responseETag = GetEtag();
if (!string.IsNullOrEmpty(eTag))
{
if (eTag.Equals(responseETag))
{
filterContext.HttpContext.Response.StatusCode = 304;
filterContext.HttpContext.Response.StatusDescription = "Not Modified";
}
return;
}
httpContext.Response.AddHeader("ETag", responseETag);
}