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

我最近遇到了最后修改的标题。

>如何和在哪里可以将其包括在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"));
    }
}

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...