C# 缓存asp.net页面

C# 缓存asp.net页面,c#,asp.net,C#,Asp.net,我正在构建一个应用程序,我尝试了YSlow,在大多数实践中都获得了F级。我有大量的jscript正在致力于减少。我希望能够缓存其中的一些页面,因为这些页面会被多次调用 我有一个主年龄,我想缓存脚本和css文件 我如何做到这一点? 是否有任何推荐的最佳实践? 还有其他性能改进吗?您应该创建单独的.js和.css文件,浏览器为您进行缓存。使用js最小化工具删除js文件中的所有空白也是一个好主意 如果你有一个大于100Kb的大视图状态,也试着减少它。如果ViewState仍然很大,您可以将ViewSt

我正在构建一个应用程序,我尝试了YSlow,在大多数实践中都获得了F级。我有大量的jscript正在致力于减少。我希望能够缓存其中的一些页面,因为这些页面会被多次调用

我有一个主年龄,我想缓存脚本和css文件

我如何做到这一点? 是否有任何推荐的最佳实践?
还有其他性能改进吗?

您应该创建单独的.js和.css文件,浏览器为您进行缓存。使用js最小化工具删除js文件中的所有空白也是一个好主意

如果你有一个大于100Kb的大视图状态,也试着减少它。如果ViewState仍然很大,您可以将ViewState作为文件存储在服务器上

如果页面不太动态,也可以使用页面上的缓存


您只需创建单独的.js和.css文件,浏览器就会为您进行缓存。使用js最小化工具删除js文件中的所有空白也是一个好主意

如果你有一个大于100Kb的大视图状态,也试着减少它。如果ViewState仍然很大,您可以将ViewState作为文件存储在服务器上

如果页面不太动态,也可以使用页面上的缓存

  • 今年你重读过RFC2616了吗?如果没有,请不要这样做。试图在不熟悉HTTP的情况下建立网站就像在你喝醉的时候试图勾引某人;仅仅因为有很多人这样做并不意味着你会有好的表现

  • 如果资源可以在给定的时间段内安全地重复使用(例如,在下一个小时/天/月内是安全的),请这样说。使用cache control标头的max age组件以及expires(max age比expires好,但两者都不需要任何成本)

  • 如果您知道上次更改的时间,请在上次修改的标题中这样说(参见下面的注释)

  • 如果您不知道上次更改的时间,但可以添加知道的功能,请这样做(例如,更新时的时间戳数据库行)

  • 如果您可以保存每次更改的记录,那么就这样做,并从中构建一个电子标签。虽然电子标签不应以时间为基础,但例外情况是,如果您知道它们不能以更高的分辨率进行更改(如果您不能每.5秒更改一次以上,则最接近0.5秒的时间是可以的,以此类推)

  • 如果您收到一个请求,该请求的If Modified Since日期与上次更改时间匹配,或者If None与e-tag匹配,则发送304而不是整个页面

  • 使用Gzip或Deflate压缩(当客户机说它可以处理这两种情况时,Deflate稍微好一点),但请注意,您必须更改e-tag。为此发送正确的Vary头会破坏IE缓存,所以改为在用户代理上进行Vary(不完美世界的不完美解决方案)。如果您在.NET中运行自己的压缩,请注意刷新压缩流会导致错误,请编写一个包装器,在Close()上最后刷新之前,只刷新Flush()上的输出

  • 不要破坏为您所做的缓存。关闭静态文件上的电子标签会使您获得更好的YSlow评级和更差的性能(web服务器场除外,此时应使用YSlow推荐的更复杂的解决方案)。忽略YSlow关于关闭e-tags的说法(也许他们现在已经修复了这个bug,不再说了),除非你在一个不同服务器类型可以处理相同请求的web服务器场上(例如,IIS和Apache处理相同的URI;Yahoo是,这就是为什么这对他们有效,而大多数人不是)

  • 公共优先于私人,除非不适当

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

  • 避免发送大量viewstate。如果您可以在没有viewstate的情况下执行某些操作,那就更好了

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

  • 如果您有一个真正庞大的文件(.js、.css),那么给它一个版本号,并将该版本放入用于访问它的URI中(blah.js/?version=1.1.2)。然后,您可以设置一个很长的过期日期(1年)和/或硬编码的电子标签,而不必担心缓存过时,因为您将在下次更改版本号,而对于web的其他部分,它是一个新资源,而不是更新的资源

  • 编辑:

    我说“见下面的注释”,但没有添加注释

    任何资源的上次修改时间是以下各项中最近的一项:

  • 用于创建发送的实体的任何内容(脚本、代码隐藏)

  • 任何用作它一部分的东西

  • 任何被用作其中一部分的内容,现在都已被删除

  • 其中,数字3可能是最难解决的问题,因为它毕竟已经被删除了。一个解决方案是跟踪资源本身的更改,并在删除用于创建资源的任何内容时更新此内容,另一个解决方案是使用“软删除”,其中项目仍然存在,但标记为已删除且未以任何其他方式使用。跟踪这些信息的最佳方式取决于应用程序

  • 今年你重读过RFC2616了吗?如果没有,请不要这样做。试图在不熟悉HTTP的情况下建立网站就像在你喝醉的时候试图勾引某人;仅仅因为有很多人这样做并不意味着你会有好的表现

  • 如果资源可以在给定的时间段内安全地重复使用(例如,在下一个小时/天/月内是安全的),请这样说。使用cache control标头的max age组件以及expires(max age比expires好,但两者都不需要任何成本)

  • 如果您知道上次更改的时间,请在上次修改的标题中这样说(参见下面的注释)

  • 如果你