在mvc应用程序中看不到ETag标头

时间:2013-10-04 15:47:15

标签: http asp.net-mvc-4 etag

我想玩动作过滤器创建并实现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乙ZDpcTXlEb2N1bWVudHNcR2VuZXJhbFxDI1wuTmV0IE1lbnRvc​​mluZyBQcm9ncmFtXEhUVFBcRXhhbXBsZVxIdHRwRm9yRGV2ZWxvcGVyc1xIb21lXEFib3V0 =

你能告诉我哪里弄错了吗?

1 个答案:

答案 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);
        }