知识大全 ASP.NET AJAX 资源脚本压缩的秘密
Posted 知
篇首语:曲直都是经历,好坏都有风景。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET AJAX 资源脚本压缩的秘密相关的知识,希望对你有一定的参考价值。
ASP.NET AJAX 资源脚本压缩的秘密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
从ATLAS到正式的ASP NET AJAX已经发生了根本性的变化了 所以当时的情况就不再多做介绍了 还是先来看看一组数据 Resource Name DEBUG Unpressed DEBUG Compressed Release Unpressed Release Compressed MicrosoftAjax js bytes bytes bytes bytes MicrosoftAjaxWebForms js bytes bytes bytes bytes上表的数据我就不再多说了 一目了然 那么由谁来决定是使用Debug版本 还是Release版本 你可以设置ScriptManager的ScriptMode属性 也可以修改nfig的pilation节点的deubg属性
现在我们再来讨论一下 该如何实现脚本的压缩的?其实 这个也是相当简单的 从ASP NET AJAX给我们提供的默认配合节点中 可以非常明显的看到这样一段代码
<scriptResourceHandler enableCompression= true enableCaching= true />
但是它是被注释著的 我们只需要把这个注释去掉就OK了 奇迹就这样发生了但是 事实完全就是这样吗?未必!我想说的是 这里的压缩并不适用于低于IE 的浏览器 包括IE 有人肯定不信了 IE 可是绝大多数据普通用户使用的浏览器 这个都不支持 那这个功能还有什么意义啊!您还真别不信 事实就是这样 我们先来看一段代码 然后再来看一个例子
直接找到RuntimeScriptResourceHandler类 它实现了IScriptResourceHandler 该接口只有一个方法GetScriptResourceUrl顾名思义它就是获取访问脚本资源的URL地址 在RuntimeScriptResourceHandler中 它的实现是这样的:
string IScriptResourceHandler GetScriptResourceUrl(Assembly assembly string resourceName CultureInfo culture bool zip bool notifyScriptLoaded) if (!ScriptResourceHandler IsCompressionEnabled(HttpContext Current)) zip = false; Tuple tuple = new Tuple(new object[] assembly resourceName culture zip notifyScriptLoaded ); string text = (string) _urlCache[tuple]; if (text == null) string name; ScriptResourceHandler ScriptResourceInfo instance = ScriptResourceHandler ScriptResourceInfo GetInstance(assembly resourceName); if (instance == ScriptResourceHandler ScriptResourceInfo Empty) ThrowUnknownResource(resourceName); Stream manifestResourceStream = assembly GetManifestResourceStream(instance ScriptName); if ((manifestResourceStream == null) || (manifestResourceStream ReadByte() == )) ThrowUnknownResource(resourceName); culture = ScriptResourceHandler DetermineNearestAvailableCulture(assembly resourceName culture); Pair<AssemblyName DateTime> assemblyInfo = ScriptResourceHandler GetAssemblyInfo(assembly); AssemblyName first = assemblyInfo First; DateTime second = assemblyInfo Second; if (assembly GlobalAssemblyCache) StringBuilder builder = new StringBuilder(); builder Append(first Name); builder Append( ); builder Append(first Version); builder Append( ); if (first CultureInfo != null) builder Append(first CultureInfo); builder Append( ); builder Append(HexParser ToString(first GetPublicKeyToken())); name = builder ToString(); else name = first Name; if (_absoluteScriptResourceUrl == null) _absoluteScriptResourceUrl = VirtualPathUtility ToAbsolute( ~/ScriptResource axd ); text = string Concat(new object[] _absoluteScriptResourceUrl ?d= ScriptResourceHandler EncryptString((zip ? (notifyScriptLoaded ? Z : z ) : (notifyScriptLoaded ? U : u )) + name + | + resourceName + | + culture ToString()) &t= second Ticks ); _urlCache[tuple] = text; return text; code
其中 zip参数是用于指定是否生成带有压缩版本的URL地址 如果zip为true 则返回的参数d的第一个字符为Z或z 否则为U或u 具体是如何去压缩的 我们现在先不管 反正URL地址中的地址栏参数d的第一字符为Z或z就表明访问的资源被请求到客户端前会被压缩 因此要访问压缩的脚本资源 就要保证zip参数为true 那这个参数从何而来呢?它是由ScriptManager的Zip属性原原本本的被传递到这个方法中 这在传递的过程当中没有被修改过 而ScriptManager的Zip的属性定义如下
internal bool Zipget if (!this _zipSet) this _zip = HeaderUtility IsEncodingInAcceptList(this IPage Request Headers[ Accept encoding ] gzip ); this _zipSet = true; return this _zip; code
决定它值的是客户端HTTP请求头部是否带有Accept Encoding: gzip 因此大部分的浏览器都支持GZIP压缩过的HTTP输出流程 因此大部份浏览器的请求头部都会有这么一段 Accept Encoding: gzip deflate 因此这个值在接受IE 请求时 应该是为true才对的 而它得到的应该也是个压缩版本的资源URL请求才对啊?除非CODE 中的zip参数被改为false了 再回过头来看CODE 的开始部分有这么一段代码:
if (!ScriptResourceHandler IsCompressionEnabled(HttpContext Current)) zip = false; code
只有在这里zip的值才有可能被修改为false 那我们再来看看 ScriptResourceHandler IsCompressionEnabled究竟做了此什么了?
private static bool IsCompressionEnabled(HttpContext context) if (!ScriptingScriptResourceHandlerSection ApplicationSettings EnableCompression) return false; if ((context != null) && context Request Browser IsBrowser( IE )) return (context Request Browser MajorVersion > ); return true;code
第一 我们可以确定EnableCompression的值为true 第二 我们使用的是IE 会执行return (context Request Browser MajorVersion > ) 因为我们使用的IE 这边就会返回false 回到CODE zip的值就会被修改成false了 而此时就会返回不被压缩的URL地址了 问题就在这里 可这是为什么呢?我想一般情况下我们肯定会不理解的 看了这个你就清楚了 x?familyid= bb a bb a ec a af &displaylang=en 原来在IE 的SP 版本中 接收GZIP的数据会有问题 而这边就是给了解决这个问题的补丁包 ASP NET AJAX团队 可能担心由于这个问题引起的部分IE浏览器无法正常使用ASP NET ajax 保险起见 在IE 的请求中永不使用压缩脚本
分析了代码 为了让我们有更直观的印象 再来看一段代码例子
protected void Page_Load(object sender EventArgs e) NameValueCollection queryString = HttpUtility ParseQueryString(GetScriptResourceUrl()); Response Write(DecryptString(queryString[ ])); private static string DecryptString(string s) MethodInfo _decryptString = typeof(Page) GetMethod( DecryptString BindingFlags NonPublic | BindingFlags Static); return (string)_decryptString Invoke(null new object[] s ); private string GetScriptResourceUrl() MethodInfo GetScriptResourceUrl = typeof(ScriptManager) GetMethod( GetScriptResourceUrl BindingFlags NonPublic | BindingFlags Instance); return (string)GetScriptResourceUrl Invoke(sm new object[] MicrosoftAjax js sm GetType() Assembly );
在IE 它输出的是 USystem Web Extensions|MicrosoftAjax js| 而在FF中它输出的是 ZSystem Web Extensions|MicrosoftAjax js|
这两个不同的输出值完全就可以体现了它们请求行为的不同
接下来 简单讨论一下 我们如何修改让它去掉这个限制 在ScriptResourceHandler有一个这样的静态方法SetScriptResourceHandler 我们可以重新实现一个IScriptResourceHandler类 用这个法植入到ASP NET AJAX内部 让它们使用 但问题是SetScriptResourceHandler是一个internal的方法 使用反射呗 那还能怎么样 谁让它这样设计 既提供这个方法 又不想让人用!
cha138/Article/program/net/201311/13561相关参考
ASP.NET之用AJAX设置进度条 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
ASP.NET的MVC结构之AJAX 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ASPNET
ASP.NET中使用AJAX的简单方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 据我所知这
ASP.NET中AJAX编程开发指南 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin
知识大全 Asp.Net+Jquery.Ajax详解5-$.getScript
Asp.Net+Jquery.Ajax详解5-$.getScript 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
在ASP.NET中使用AJAX的简单方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 介绍
ASP.NET脚本侵入概述 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 从浏览器的角度来看网页
ASP.NET中使用无框架的Ajax实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们需要
Asp.netMVC中Ajax的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MVC抛弃了
知识大全 ASP.NET 2.0 AJAX中Webservice调用方法
ASP.NET2.0AJAX中Webservice调用方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一