【问题标题】:Can I force caching on a 302 temporary redirect in ASP.NET?我可以在 ASP.NET 中强制缓存 302 临时重定向吗?
【发布时间】:2014-04-29 08:36:07
【问题描述】:

我有一个 ASPX 页面,它发出一个指向图像文件的Response.Redirect

重定向响应标头如下所示:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: https://www.site.com/folder/file.jpg
Server: Microsoft-IIS/8.0
Date: Tue, 29 Apr 2014 08:29:58 GMT
Content-Length: 241

是否可以强制客户端和任何代理服务器将此响应缓存 30 天?我应该使用 Cache-Control、ETags 还是两者兼而有之?如果有,怎么做?

【问题讨论】:

    标签: asp.net caching cache-control outputcache


    【解决方案1】:

    我已经弄清楚并测试了它。以下代码添加了 ETag 和缓存控制:

    protected void Page_Load(object sender, EventArgs e)
    {
        var absoluteUrl = GetUrlFromDatabase(Request["fileId"]);
        CacheResponse(absoluteUrl);
        Response.Redirect(absoluteUrl);
    }
    
    private static void CacheResponse(string absoluteLocation)
    {
        // you need to clear the headers that ASP.NET automatically adds
        HttpContext.Current.Response.ClearHeaders();
    
        // now get the etag (hash the 
        var etag = GetETag(absoluteLocation);
    
        // see if the etag matches what was sent
        var requestedETag = HttpContext.Current.Request.Headers["If-None-Match"];
        if (requestedETag == etag)
        {
            HttpContext.Current.Response.Status = "304 Not Modified";
            HttpContext.Current.ApplicationInstance.CompleteRequest();
    
            return;
        }
    
        // otherwise set cacheability and etag.
        HttpContext.Current.Response.Cache.SetValidUntilExpires(true);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
        HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddMonths(1));
        HttpContext.Current.Response.Cache.SetLastModified(DateTime.UtcNow);
        HttpContext.Current.Response.Cache.SetETag("\"" + etag + "\"");
    }
    
    private static string GetETag(string url)
    {
        var guid = StringToGuid(url);
        var etag = new ShortGuid(guid); // see reference to ShortGuid below
        return etag.Value.Replace("-", string.Empty);
    }
    
    private static Guid StringToGuid(string value)
    {
        // Create a new instance of the MD5CryptoServiceProvider object.
        var md5Hasher = MD5.Create();
    
        // Convert the input string to a byte array and compute the hash.
        var data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(value));
        return new Guid(data);
    }
    

    参考:ShortGuid

    初始 HTTP 响应标头现在是:

    HTTP/1.1 302 Found
    Cache-Control: private
    Content-Type: text/html; charset=utf-8
    Expires: Thu, 29 May 2014 09:07:41 GMT
    Last-Modified: Tue, 29 Apr 2014 09:07:41 GMT
    ETag: "k28kbGNuxkWzP6gmLO2xQ"
    Location: https://www.site.com/folder/file.jpg
    Date: Tue, 29 Apr 2014 09:07:41 GMT
    Content-Length: 241
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2014-04-25
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多