2010-08-20 124 views
0

我正在构建一个应用程序,我尝试了YSlow并获得了大部分练习的F级。我有很多正在减少的jscript。我希望能够缓存其中的一些内容,因为页面会被多次调用。缓存asp.net页面

我有一个主时代,我想缓存脚本和css文件。

我该如何做到这一点? 有没有推荐的最佳实践? 我能做出其他性能改进吗?

+0

YSlow建议你可以做不同的性能改进。至于缓存你的脚本,请确保它们被外部化为单独的文件,并且它们将被客户端浏览器自动缓存。如果可能的话,尽量减少它们的数量,将它们分组为更少的文件以减少网络呼叫。 – 2010-08-20 11:56:39

+0

不知道你在这里问什么。 YSlow的建议是关于客户端的。 ASP.NET缓存是关于服务器端的。实现ASP.NET缓存不会改变YSlow评级中的任何内容。 – 2010-08-20 11:57:25

+1

注意:如果您不在农场,请忽略YSlow关于电子标签的评论。如果你在农场,建议采用更复杂的方法。关闭电子标签的建议比没有用的更糟糕,并且损害了性能。 – 2010-08-20 11:59:15

回答

4
  1. 有你今年重读2616了吗?如果没有,那么。尝试构建不熟悉HTTP的网站就像是在醉酒时试图诱惑某人;只是因为很多其他人这样做并不意味着你会有很好的表现。

  2. 如果某个资源可以在给定的时间段内安全地重新使用(例如安全等待下一个小时/日/月),请这么说。使用缓存控制头的max-age组件以及expires(max-age比expires更好,但两者都不需要花费)。

  3. 如果您知道上次更改的时间,请在Last-Modified标题中说明(请参阅下面的注释)。如果您不知道什么时候上次更改了某些内容,但是可以添加知道的功能,则可以这样做(例如,UPDATE上的时间戳数据库行)。

  4. 如果您可以保存每次更改内容的记录并从中创建电子标签。虽然电子标签不应该以时间为基础,但是如果你知道它们不能以更精细的分辨率进行更改,那么例外就是例外(时间到最近的0.5秒是好的,如果每0.5秒不能超过1次) )

  5. 如果您收到带有If-Modified-Since的匹配上次更改时间的日期或匹配电子标签的If-None-Match的请求,请发送304而不是整个页面。

  6. 使用Gzip或Deflate压缩(当客户说它可以处理这两种压缩时放气略好,但请注意您必须更改电子标签。为此发送正确的Vary头部会破坏IE缓存,因此改变User-Agent(不完美的世界的不完美解决方案)。如果在.NET中使用自己的压缩方式,请注意刷新压缩流会导致错误,请在Close()上最后一次刷新之前编写一个仅在Flush()上刷新输出的包装器。

  7. 不要为您完成高速缓存。关闭静态文件上的电子标签可以使您获得更好的YSlow评级和更差的性能(当应使用由YSlow推荐的更复杂的解决方案时,除了在网站上)。忽略YSlow关于关闭电子标签的说法(也许他们已经修复了这个错误,现在不再说了),除非你在一个Web服务器场中,不同的服务器类型可以处理相同的请求(例如IIS和Apache处理相同的URI;雅虎是这是为什么这为他们工作,大多数人都没有)。

  8. 公众对私人的看法,除非不合格。

  9. 避免做任何依赖于会话的事情。如果你能关闭会议,那就更好了。

  10. 避免发送大量的视图状态。如果你可以做一些没有视图状态的东西,那么更好。

  11. 进入IIS并查看HTTP Headers部分。为静态文件设置适当的值。请注意,这可以在每个站点,每个目录和每个文件的基础上完成。

  12. 如果你有一个真正的海量文件(.js,.css),那么给它一个版本号,并将该版本放入用于访问它的URI(blah.js /?version = 1.1.2)。然后,您可以设置一个非常长的到期日期(1年)和/或硬编码的电子标签,而不必担心缓存过期问题,因为您将在下一次更改版本号,并将其更改为网络的其他部分,这是一种新的资源比更新的一个。

编辑:

我说: “见下面的说明” 并没有添加注释。

任何资源的最后修改时间是最近的:

  1. 任何东西(脚本,代码隐藏)用于创建发送的实体。

  2. 任何用作它的一部分。

  3. 任何被用作它的一部分,现在已被删除。

其中,编号3可能是最棘手的工作,因为它毕竟已被删除。一种解决方案是跟踪资源本身的变化,并在删除用于创建资源的任何东西时进行更新,另一种方法是在物品仍然存在的情况下进行“软删除”,但标记为已删除且未用于任何其他方式。追踪这些东西的最佳方式是,取决于应用程序。

+0

非常感谢。真正有用的输入。 – Churchill 2010-08-20 14:25:38

1

您应该创建单独的.js和.css文件,浏览器会为您执行缓存。使用从js文件中删除所有空白的js-minimizer也是一个好主意。

如果您有一个像> 100Kb的巨大ViewState,请尽量减少它。如果ViewState的仍然是巨大的,你可以ViewState的存储服务器上的文件中...

http://aspalliance.com/472

您也可以使用缓存的页面,如果该页面是不是太动态...

http://msdn.microsoft.com/en-us/library/06bh14hk.aspx

1

您还可以将常见的js和css库引用到可信的在线商店。例如,如果将jquery添加为<script src="http://code.jquery.com/jquery-latest.js"></script>,那么由于之前引用此地址的其他网站(即使它因为您的网站而被缓存),jquery文件可能已被客户端的浏览器缓存。 这种方式可能有利有弊,但有这样一种方法。 另外我不知道YSlow的回应是否会以这种方式发生变化。

+0

专家如你所描述的那样,如果客户最近没有看到来自该域的任何内容,那么con是额外的dns-lookup命中。如果使用来自同一个域的多个文件,Pro强大地胜过它。我不知道YSlow的回应是否会改变,但是谁在乎 - 工具应该适合我们,而不是我们的工具。 – 2010-08-20 12:20:07