手机版

ASP.NET组件系统 缓存问题的优化原理和详细说明

时间:2021-10-30 来源:互联网 编辑:宝哥软件园 浏览:

1]开篇介绍。

本文将简要分析ASP.NET组件系统的运行原理和基本缓存问题。与静态文件绑定相关的优化:

我们的项目中有很多静态文件。为了追求模块化和插件化,很多静态文件被设计成模块或者分解,必要时通过组合在UI层使用。这就带来了一个问题。更多的文件会影响浏览器加载页面的速度。而且由于浏览器的并发限制,对并行请求没有限制,所以绑定静态文件的功能就产生了。事实上,在过去,当IIS没有集成管道模型时,我们只能以动态资源的方式输出,也就是说,我们经常在*的末尾看到许多请求。axd在*aspx页面中,当然,在大多数情况下,它是用来与ASP.NETAJAX合作输出动态JS、HTMDOM和CSS的。

最新的IIS很好的集成了ASP.NET管道模型,也就是说我们可以通过ASP.NET本身的扩展完全控制所有通过IIS的请求,包括静态文件,所以可以捆绑静态文件。

我们将分析系统的基本工作原理。优化组件,如何动态加载,以及如何控制缓存。

2]系统。web .优化组件。

每当我们创建一个新的ASP。NETMVC4站点,在~/app _ start目录下会有一个BundleConfig.cs的启动文件。当然,其他ASP。将创建NET4.0及以上项目。

第一次看到这份文件,真的很困惑,我就简单分析一下,了解一下它的基本原理。

代码是静态方法,然后传入一个BundleCollection集合对象,这个集合对象实际上是Bundle对象的集合,然后将多个Bundle注册到集合中;每个Bundle对应多个静态文件,这些静态文件可以想象成键值对的集合。通过后面的Include方法包含n个静态文件,其中静态文件路径可以是符合特定规则的字符串,该字符串是内部计算的;

这是注册阶段,然后是使用阶段。使用阶段很简单,只要我们通过我们注册的Key字符串就可以直接引用这些静态文件列表;

只要我们关注Styles。渲染和脚本。Render,这两种方法是将后台配置的静态文件列表注入到页面之前;这样,我们在客户端看到的就是捆绑的文件集合;

文件的连接地址已经是绑定后的地址。这个地址是我们之前注册时使用的密钥,它需要这个密钥来获取值静态文件的列表。如果你想要你的绑定效果,你需要在注册的时候加一段:bundletable。enableoptimizations=true代码,这意味着如果未启用绑定,默认情况下在调试环境中不会有任何影响,因为系统。优化使用默认的绑定策略。如果它处于调试模式,将不会启用绑定,如果您人为设置它,它将覆盖默认设置。

就这样。现在我们需要了解它是如何工作的,以及它的基本原理。

3.【3】系统的基本原理。网络优化组件。

由于IIS集成了管道模型,我们肯定可以找到对应的HttpModule。为了节省时间,我不会下载源代码。让我们直接用反编译工具来看看。

这是Bundle的HttpModule,虽然在HTTP管道中,但是只用来处理Bundle的连接地址;很容易找到,但奇怪的是,我在Web.config中没有找到它的配置信息,这很奇怪,但它当然不可能更改系统文件。所以我一时想不起来有什么动态注册的方法。提到动态注册我突然有个想法。Application_Start启动时似乎有一个用于注册预代码的汇编级特性,它将在Application启动前执行。让我们来看看。

果然,它就藏在这里。它注册了一个静态的PreApplicationStartCode类,并使用start方法启动它。

这段代码非常简单。首先,判断是否已经进行了登记。如果没有,请执行动态注册。这个动态注册组件在。NETFramework。它只与微软的平台相关。网络。基础设施,与ASP.NET没有直接关系。我们可以用微软。开发我们自己的网络组件的基础设施。这里有一个问题,为什么要判断静态法?它只会被执行一次,因为静态方法的执行是不受控制的,所以很有可能会不加判断地被注册几次,为了严谨考虑而添加。

现在,基本上,我们已经找到了源头。让我们先把它放在服务器端。关于客户端有很多问题。既然是给我们绑定的,缓存是怎么处理的?也就是说,它的输出缓存是否设置,如果设置了,就不是问题;

[客户端缓存相关]

为了更好地理解请求之间的信息,我们使用Fiddler来倾听。

我们可以看到,文件的Cache部分使用If-Modified-before来表示本地文件的最后一次修改,这样服务器就可以验证文件是否已经更改。如果没有变化,则服务器的响应状态代码为304,这意味着Bundle在输出时没有为此文件设置客户端强制缓存。我们也可以从Pragma:无缓存头看到。

然后我们得出结论,Bundle中的所有文件都不能直接缓存在浏览器中,每次都会带来缓存段If-Modified-from来验证服务器的文件版本。这里我们可以只匹配动态输出的静态文件地址后面的参数;

例如:

/Content/css?v=zpnwvrt3c 0 yyyrvdpmi-xkjuhdjfqsl3a 0 K5 9 wtok 01

该链接后面的v参数指示当前Bundle之后的虚拟文件版本。如果我们在服务器上修改该文件,该文件的如果修改自验证将失败,并且将生成一个新的版本号作为连接参数。我们来看一看,切实一点;

我加了一个width:auto的样式,所以刷新客户端的时候应该不会再有304了;

显然/内容/css?文件v=doyfok 3 bdoywdibbq 7 juv 6 eqdljau 6 RTC 0g 13 El 7x 041的版本已更改,因此Response不应为304;

如果静态文件的版本号发生变化,则根本不会带来If-Modified-been,用于每次Post验证;事实上,如果没有IIS集成模式,绑定文件的方式只能改变静态文件的文件名;

4.展开自定义类型静态文件。

Bundle对象是所有需要捆绑的文件的基类。如果需要扩展一些静态文件,比如一些特定字段的静态文件,可以直接继承这个类。

[缓存XML文件]

XML文件非常简单。我们只需要继承Bundle对象。所有动态生成的网址都有特殊的对象处理。让我们看看代码。

public class XmlBundle : Bundle { public XmlBundle(字符串路径): base(路径){ } } public static class XmlBundleRender { public static IHtmlString Render(字符串路径){ bundlerersolver Bundle=new bundlerersolver(BundleTable。捆绑包);返回新的HtmlString(字符串。Format(@'link href=''{0}'' rel='样式表' '/',bundle。GetBundleUrl(路径)));}}首先我们需要一个从Bundle对象继承的xmlBundle来表示所有要传输的XML文件的绑定容器,然后我们需要一个静态的方法来注册绑定的URL;

URL是由一个特殊的BundleResolver对象生成的,我们只需要传入所有的BundleCollection对象。我写了一个链接;以便在浏览器中测试它。这样,我们可以在需要的地方直接使用它。我在索引视图中引用了@ mvcapp application 4 . seed . xmlbundlerender . render(~/custom/XML)。是不是很简单,让我们可以绑定所有想要控制绑定的文件,只需要继承和添加简单的静态方法来辅助;

让我们看看我们的XML文件是否具有所有的缓存特性。

第一个请求没有添加If-Modified-from段,返回的内容是一个简单的model222/model测试。现在让我们看看它下次是否会在不更改内容的情况下使用缓存。

正如我们所料,使用了缓存的数据。接下来,我们需要修改服务器上的XML文件,将222更改为243454637,看看本地缓存是否会自动刷新,即不会返回304。

它还刷新了缓存,这符合理论基础,并正确地返回了我们修改后的值。

总结:其实HTTP不仅仅是在浏览器中使用,使用HTTP的场合也很多,所以我们可以利用好这个功能来捆绑一些图片、文字等场合,确实是一个不错的组件。文末,谢谢;

作者:王庆培。

来源:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博主园区所有,欢迎转载。但是,未经作者同意,您必须保留此声明,并在文章页面的明显位置给出原文的链接,否则,您保留追究法律责任的权利。

版权声明:ASP.NET组件系统 缓存问题的优化原理和详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。