学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(五)

来源:互联网 发布:淘宝女士丝巾 编辑:程序博客网 时间:2024/05/01 14:29

2.AreaRegistration的缓存

Area的注册(主要是基于Area的路由映射注册)通过具体的AreaRegistration来完成。在应用启动的时候,ASP.NET MVC会遍历通过调用BuildManager的静态方法GetReferencedAssemblies得到的程序集列表,并从中找到所有AreaRegistration类型。如果一个应用涉及太多的程序集,则这个过程可能会耗费很多时间。为了提高性能,ASP.NET MVC会对解析出来的所有AreaRegistration类型列表进行缓存。

ASP.NET MVCAreaRegistration类型列表的缓存是基于文件的。具体来说,当ASP.NET MVC框架通过程序集加载和类型反射得到了所有的AreaRegistration类型列表后,会对其序列化并将序列化的结果保存为一个物理文件。这个名为“MVC-AreaRegistrationTypeCache-xml”的XML文件被保存在ASP.NET的临时目录下,具体的路径如下。其中第一个针对寄宿于Local IIS中的Web应用,后者针对直接通过Visual Studio Developer Server或者IIS Express作为宿主的应用。

1.%Windir%\Microsoft.NET\Framework\v{version}\TemporaryASP.NET Files\{appname}\...\...\UserCache\

2.%Windir%\Microsoft.NET\Framework\v{version}\TemporaryASP.NET Files\root\...\...\UserCache\

下面的XML片段体现了这个作为所有AreaRegistration类型缓存的XML文件的结构。我们从中可以看到所有的AreaRegistration类型的名称,连同它所在的托管模块和程序集名称都被保存了下来。当AreaRegistration的静态方法RegisterAllAreas被调用之后,系统会试图加载该文件,如果该文件存在并且具有期望的结构,那么系统将不再通过程序集加载和反射来解析所有AreaRegistration的类型,而是直接对文件内容进行反序列化得到所有AreaRegistration类型的列表。

<?xml version="1.0" encoding="utf-8"?><!--This file is automatically generated. Please do not modify the contents ofthis file.--><typeCache lastModified="3/3/2014 10:06:29 AM"mvcVersionId="72d59038-e845-45b1-853a-70864614e003"><assembly name="Artech.Admin, Version=1.0.0.0, Culture=neutral,PublicKeyToken=null"><module versionId="07be22a1-781d-4ade-bd22-34b0850445ef"><type>Artech.Admin.AdminAreaRegistration</type></module></assembly><assembly name="Artech.Portal, Version=1.0.0.0, Culture=neutral,PublicKeyToken=null"><module versionId="7b0490d4-427e-43cb-8cb5-ac1292bd4976"><type>Artech.Portal.PortalAreaRegistration</type></module></assembly></typeCache>


如果这样的XML不存在,或者具有错误的结构(这样会造成针对AreaRegistration类型列表的反序列化失败),ASP.NET MVC框架会按照上述的方式重新解析出所有AreaRegistration类型列表,并将其序列化成XML保存到这个指定的文件中。值得一提的是,针对Web应用的程序编译会促使这些缓存文件的清除。

 

1 0