加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 最后修改标头在MVC

发布时间:2020-12-15 21:09:11 所属栏目:asp.Net 来源:网络整理
导读:我最近遇到了最后修改的标题。 如何和在哪里可以将其包括在MVC? 包括它的优点是什么? 我想要一个示例如何最后修改的标题可以包括在mvc项目,静态页面和数据库查询以及? 它是不同于outputcache,如果是如何? 基本上,我想让浏览器自动清除缓存并显示最新
我最近遇到了最后修改的标题。

>如何和在哪里可以将其包括在MVC?
>包括它的优点是什么?

我想要一个示例如何最后修改的标题可以包括在mvc项目,静态页面和数据库查询以及?

它是不同于outputcache,如果是如何?

基本上,我想让浏览器自动清除缓存并显示最新的数据或页面,而不需要用户刷新或清除缓存。

解决方法

Last-Modified主要用于缓存。它被发送回资源??,您可以跟踪修改时间。资源不一定是文件,而是任何东西。例如从具有UpdatedAt列的dB信息生成的页面。

它与If-Modified-Since头结合使用,每个浏览器在请求中发送(如果它先前已经接收到Last-Modified头)。

How and where can I include it in MVC?

Response.AddHeader

What are the advantages of including it?

对动态生成的页面启用细粒度缓存(例如,您可以使用DB字段UpdatedAt作为最后修改的头)。

要使一切工作,你必须做这样的事情:

public class YourController : Controller
{
    public ActionResult MyPage(string id)
    {
        var entity = _db.Get(id);
        var headerValue = Request.Headers['If-Modified-Since'];
        if (headerValue != null)
        {
            var modifiedSince = DateTime.Parse(headerValue).ToLocalTime();
            if (modifiedSince >= entity.UpdatedAt)
            {
                return new HttpStatusCodeResult(304,"Page has not been modified");
            }
        }

        // page has been changed.
        // generate a view ...

        // .. and set last modified in the date format specified in the HTTP rfc.
        Response.AddHeader('Last-Modified',entity.UpdatedAt.ToUniversalTime().ToString("R"));
    }
}

您可能需要在DateTime.Parse中指定格式。

参考文献:

> HTTP status codes
> HTTP headers

Disclamer:我不知道ASP.NET / MVC3是否支持你自己管理Last-Modified。

更新

您可以创建一个扩展方法:

public static class CacheExtensions
{
    public static bool IsModified(this Controller controller,DateTime updatedAt)
    {
        var headerValue = controller.Request.Headers['If-Modified-Since'];
        if (headerValue != null)
        {
            var modifiedSince = DateTime.Parse(headerValue).ToLocalTime();
            if (modifiedSince >= updatedAt)
            {
                return false;
            }
        }

        return true;
    }

    public static ActionResult NotModified(this Controller controller)
    {
        return new HttpStatusCodeResult(304,"Page has not been modified");
    }   
}

然后使用它们像这样:

public class YourController : Controller
{
    public ActionResult MyPage(string id)
    {
        var entity = _db.Get(id);
        if (!this.IsModified(entity.UpdatedAt))
            return this.NotModified();

        // page has been changed.
        // generate a view ...

        // .. and set last modified in the date format specified in the HTTP rfc.
        Response.AddHeader('Last-Modified',entity.UpdatedAt.ToUniversalTime().ToString("R"));
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读