当前位置: 首页 > 知识库问答 >
问题:

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

郜杰
2023-03-14

我想玩动作过滤器创建和实施ETag的动作过滤器,并使HomeController从mvc 4模板缓存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开发工具网络中-

请求URL: http://: 1772/Home/关于请求方法: GET状态码: 200 OK请求Headersview源接受: text/html,应用程序/xhtml xml,应用程序/xml; q=0.9,/; q=0.8接受-编码: gzip,泄气, sdch接受-语言: en-US, en; q=0.8连接:保活Cookie:__RequestVerificationToken=q0yQrf5ee5bsOW-1OXK754FeRZM89uNQQ1rvN2cVRXaHsPGhOTt2zw2cUyfmu-0uZGLL5-ebs-iJH1-RQ3Q7qb6z4jTHNY8yGJQ3KBYhRs1主机:<--PLHD--0/>引用者:http://: 1772/User-Agent: Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,像壁虎)Chrome/29.0.1547.76Safari /537.36响应头视图源缓存控制:私有内容编码: gzip内容长度: 956内容类型:文本/html;charset=utf-8日期:星期五,2013 15:34:0210月4日格林尼治标准时间服务器:Microsoft IIS/8.0变化:接受编码X-AspNet-Version: 4.0.30319 X-AspNetMvc-Version: 4.0 X-Powerd-By: ASP. NET X-SourceFiles:=?UTF-8?B?ZDpcTXlEb2N1bWVudHNcR2VuZXJhbFxDI1wuTmV0IE1lbnRvcmluZyBQcm9ncmFtXEhUVFBcRXhhbXBsZVxIdHRwRm9yRGV2ZWxvcGVyc1xIb21lXEFib3V0?=

你能告诉我哪里错了吗?

共有1个答案

施永宁
2023-03-14

这个作品:

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);
        }
 类似资料:
  • 如何在Google Cloud上查看日志消息?:https://console.cloud.google.com/logs 这是我在运行dev_appserver.py(本地运行)时在终端中看到的: 将显示应用程序日志消息和请求日志记录。 但是,当我查看部署的相同代码的日志时,我只能看到正在记录的请求: 我用来生成应用程序日志消息的代码如下: 但我也尝试过直接使用<code>logging.inf

  • 在React Native应用程序中实现以下场景的最佳方式是什么? 向服务器发出HTTP请求,获取JSON响应和ETag头 保存此JSON响应的方式即使在用户重新启动应用程序后也会持续 每当重复此HTTP请求时,发送If-None-Match头。 当您得到“未修改”响应时,请使用持久化缓存中的版本 当您得到“成功”响应(表示响应已更改)时,使持久化缓存无效,保存新响应 React Native有现

  • 我希望能够识别唯一的匿名用户,所以我可以在数据库中为该用户存储一些信息。一个客人购物车之类的东西。 我并不特别想使用会话,因为如果我一直使用无会话数据方法构建,我喜欢服务器之间的故障转移。 在spring security或generic spring中,是否有任何方法可以获得一个标识令牌,我可以使用它来标识特定的匿名用户(主键)?

  • 大家好,我正在学习如何使用Spring,我没有MVC方面的经验。 所以我正在创建一个网站,对mysql数据库的数据进行注册、注销和更改。登录和数据库插入都准备好了,但我不能删除注册用户部分。 我的模型: 我的控制器: 我的服务和实施: 实施: 最后是StudentDeleteRepository: 学习积极性。JAVA 在我的删除中。jsp都是从以下内容开始的: 我得到了这个错误: 这部分是: 为

  • 我想运行节点。js与asp。net mvc用于执行套接字。io操作。 我已经成功地包含了节点。js在asp。net mvc,如本文所述 我的问题是如何在ASP.NET MVC中运行express.js, 我已经在Global.asax.cs文件中执行了url重写,如< br > void Application_BeginRequest(对象发送方,EventArgs e) { //获取当前路径

  • 我有一个Spring Boot应用程序,我在pom中定义了我的thymeleaf依赖项。包含以下行的xml: 因此,当我启动应用程序并打印预定义的bean名称时,我会看到这些bean(我认为这对thymeleaf正常运行很重要): 模板引擎 thymeleafResourceResolver thymeleafViewResolver 项目结构如下所示: 我在fragments.html中定义了一