如何从jQuery设置eTag标头?

时间:2014-05-13 14:35:27

标签: jquery asp.net http caching etag

我正在开发一个单页应用程序,我对服务器有很多请求。有一个非常大的响应(如20-30 kb),这个响应每周更改一次,我想基于eTag在浏览器中缓存响应。 ETag是从服务器正确设置的,但浏览器不会在下一个请求时发回eTag。

这是我的服务器代码:

public string GetActiveConfiguration()
    {
        var requestedETag = Request.Headers["If-None-Match"];
        var responseETag = layoutRepository.GetActiveConfigurationVersion().ToString();
        if (requestedETag == responseETag)
        {
            Response.StatusCode = 304;
            return "";
        }
        Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
        Response.Cache.SetETag(responseETag);
        return layoutRepository.GetActiveConfiguration();
    }

这是我的客户代码:

$.ajax({
            url: 'Admin/GetActiveConfiguration',
            type : 'GET',
            ifModified: true,
            success: function (data) {
                that.configuration = $.parseJSON(data);
                that.setRoles();
                that.setTitleAndIcon();
                that.initializeChat();
                callback();
                //that.loadViews(Object.keys(window.params)[0]);
            }
        });

以下是服务器响应:

  

缓存控制:私人   内容编码:gzip   内容长度:6544   内容类型:text / html的;字符集= utf-8的   日期:2014年5月13日星期二14:19:52 GMT    ETag:13.05.2014 17:01:02   服务器:Microsoft-IIS / 8.0   有所不同:接受编码   X-ASPNET-版本:4.0.30319   X-AspNetMvc-版本:4.0   X-已启动方式:ASP.NET   X-SourceFiles:????= UTF-8乙QzpcUHJvamVjdHNcZUNvbW1lcmNlXE1pY3JvaW52ZXN0IGVDb21tZXJjZSBQcm8gTmV3XE1pY3JvaW52ZXN0IGVDb21tZXJjZSBQcm8gTmV3XEFkbWluXEdldEFjdGl2ZUNvbmZpZ3VyYXRpb24 = =

以下是客户请求:

  

接受: /   接受编码:gzip,放气,SDCH   接受语言:EN-GB,EN; Q = 0.8   缓存控制:无缓存   连接:保持活跃   饼干:I'llhideThoseOnPurpose :)   主持人:本地主机:61061   附注:无缓存   引用站点:本地主机   用户代理:Mozilla / 5.0(Windows NT 6.2; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 34.0.1847.131 Safari / 537.36   X-请求-随着:XMLHttpRequest的

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在服务器端添加:

context.Response.Cache.VaryByHeaders["If-None-Match"] = true;

参考:http://optimizeasp.net/conditional-get