相关疑难解决方法(0)

ASP.NET中的缓存控制标头

我正在尝试为Web应用程序设置缓存控制标头(看起来我能够做到这一点),但我得到的是我认为标题响应中的奇数条目.我的实现如下:

    protected override void OnLoad(EventArgs e)
    {
        // Set Cacheability...
        DateTime dt = DateTime.Now.AddMinutes(30);
        Response.Cache.SetExpires(dt);
        Response.Cache.SetMaxAge(new TimeSpan(dt.ToFileTime()));

        // Complete OnLoad...
        base.OnLoad(e);
    }
Run Code Online (Sandbox Code Playgroud)

这就是标题响应显示的内容:

-----
GET /Pages/Login.aspx HTTP/1.1
Host: localhost:1974
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-lori-time-1: 1244048076221
Cache-Control: max-age=0

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Wed, 03 Jun 2009 16:54:36 GMT
X-AspNet-Version: 2.0.50727
Content-Encoding: gzip
Cache-Control: private, max-age=31536000 …
Run Code Online (Sandbox Code Playgroud)

c# asp.net caching header

27
推荐指数
2
解决办法
4万
查看次数

ASP.NET MVC和IE缓存 - 操纵响应头无效

背景

我试图帮助一位同事调试过去6个月来一直没有问题的问题.在最近部署ASP.NET MVC 2应用程序之后,FileResult强制用户打开或保存PDF文件的响应在客户端计算机上存在的问题足够长,以便PDF阅读器打开它们.

早期版本的IE(特别是6)是受影响的唯一浏览器.Firefox和Chrome以及较新版本的IE(> 8)都表现得如预期.考虑到这一点,下一节将定义重新创建问题所需的操作.

行为

  1. 用户单击指向操作方法的链接(具有href属性的普通超链接).
  2. action方法生成表示为字节流的PDF.该方法始终重新创建PDF.
  3. 在action方法中,标头设置为指示浏览器如何缓存响应.他们是:

    response.AddHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0");
    response.AddHeader("Pragma", "no-cache");
    response.AddHeader("Expires", "0");
    
    Run Code Online (Sandbox Code Playgroud)

    对于那些不熟悉标题的人不熟悉:

    一个.缓存控制:公共

    表示任何缓存都可以缓存响应,即使它通常只是非缓存或只能在非共享缓存中缓存.

    缓存控制:必须重新验证

    当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它

    C.缓存控制:预检(IE5引入)

    定义以秒为单位的间隔,在此之后必须检查实体的新鲜度.检查可能在用户显示资源后发生,但确保在下一次往返时缓存的副本将是最新的.

    d.缓存控制:后检查(IE5引入)

    定义以秒为单位的时间间隔,在此之后必须在向用户显示资源之前检查实体的新鲜度.

    Pragma:no-cache(确保向后兼容HTTP/1.0)

    当请求消息中存在no-cache指令时,应用程序应该将请求转发到源服务器,即使它具有所请求内容的缓存副本

    F.过期

    Expires entity-header字段给出了响应被视为过时的日期/时间.

  4. 我们从操作中返回文件

    return File(file, "mime/type", fileName);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 向用户显示"打开/保存"对话框

  6. 单击"保存"按预期工作,但单击"打开"启动PDF阅读器,但是当读者尝试打开文件时,已存储的临时文件IE已被删除,因此它抱怨文件丢失(并且它是).

这里有六个其他应用程序使用相同的标题来强制Excel,CSV,PDF,Word和大量其他内容在用户,从来没有一个问题.

问题

  • 标题是否适合我们正在尝试的内容?我们希望文件暂时存在(获得缓存),但总是被新版本替换,即使请求可能相同).

在返回a之前,在action方法中设置响应头FileResult.我已经让我的同事尝试创建一个继承的新类,FileResult然后重写该ExecuteResult方法,以便它修改标题,然后base.ExecuteResult()改为 - 没有状态.

我预感到"0"的"Expires"标题是罪魁祸首.根据这篇W3C文章,将其设置为"0"意味着"已经过期".我确实希望它过期,我只是不希望IE在处理它的应用程序有机会打开它之前将其从文件系统中删除.

一如既往,谢谢!

编辑:解决方案

在进一步测试(使用Fiddler检查标头)时,我们发现我们认为设置的响应头不是浏览器解释的响应头.由于我自己并不熟悉代码,因此我没有意识到一个潜在的问题:标题在操作方法之外被踩到了.

尽管如此,我还是要打开这个问题.依然突出是这样的:有似乎是有出入Expires具有数值头 …

asp.net iis caching http-headers asp.net-mvc-2

24
推荐指数
1
解决办法
2万
查看次数

标签 统计

asp.net ×2

caching ×2

asp.net-mvc-2 ×1

c# ×1

header ×1

http-headers ×1

iis ×1