使用ASP.NET 2.0提供的WebResource管理资源
在 ASP.net 2.0 構(gòu)建的Web頁面中,查看源文件,我們經(jīng)常會看到下面的Html文本
<script src="/WebResource.axd?d=QfRKDnWw93T08KaF3ioSKQ2&t=633313193233609691" type="text/javascript"></script>
<script src="/WebResource.axd?d=9iVKU5SS0wd5al1SYg8zjL8XXbP97LbENHerY4aLtJk1&t=633313193233609691" type="text/javascript"></script>
這是 ASP.net 2.0 提供的新的資源管理方式產(chǎn)生的腳本。
新的資源管理方式如何使用,你可以參看以下幾篇博客:
使用ASP.NET 2.0提供的WebResource管理資源
http://birdshome.cnblogs.com/archive/2004/12/19/79309.html
在自定義Server Control中捆綁JS文件 Step by Step
http://www.cnblogs.com/jackielin/archive/2005/11/29/286570.html
使用 ASP.NET 2.0 中 Web 資源
http://support.microsoft.com/kb/910442
http://www.cnblogs.com/yeahooh/archive/2007/07/27/833846.html
?
使用 WebResource管理資源時, 我們會經(jīng)常收到類似下面的異常:
System.Web.HttpException: 無效的視圖狀態(tài)。
System.Security.Cryptography.CryptographicException: 填充無效,無法被移除。
比如下面幾個文章就提到了這個問題:
Annoying CryptographicException on WebResource.axd
http://forums.asp.net/t/934913.aspx
ASP.Net’s WebResource.axd and machineKey badness
http://blog.aproductofsociety.org/?p=11
?
這是因為 WebResource.axd? URL 的參數(shù)具有時效性,但是對于搜索引擎的爬蟲來說,他們會經(jīng)常訪問這些參數(shù)過期的地址,所以就會出現(xiàn)上面的異常。
這個問題的解決方案,目前沒有更好的方案,微軟論壇中只是建議在robots.txt 文件中增加下面的信息:
User-agent: *
Disallow: /*.axd$
但是這要求遵循 robots.txt 規(guī)范的爬蟲們下次獲得最新的 robots.txt 才會起作用。而對于那些不遵循 robots.txt 規(guī)范的爬蟲,可一點辦法都沒有。
?
我現(xiàn)在的想法是,能不用 WebResource.axd? 就不要用,因為國內(nèi)不遵循robots.txt 規(guī)范的爬蟲們太多了。這就需要我們來分析那些場景使用了? WebResource.axd? 中的資源,也就是 需要對 WebResource.axd? 的格式進(jìn)行分析。
?
WebResource.axd 的 URL 的格式是:
???????? WebResource.axd?d=encrypted 標(biāo)識符 & T = 時間戳值。
其中:
??????? " d " 代表請求 Web 資源。? (encrypted identifier)
?????? " t " 是 timestamp 對程序集, 這有助于在確定如果已經(jīng)對資源的更改請求。
?
t 參數(shù)對于我們分析誰使用它,沒有意義,我們下面就來分析 d 參數(shù)。
?
d 參數(shù)的解析代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" %> <script runat="server"> public static string PageDecryptString(string input) { Type type = typeof(System.Web.UI.Page); object o = Activator.CreateInstance(type); System.Reflection.MethodInfo mi = type.GetMethod("DecryptString",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static,
null, new Type[] { typeof(string) }, null); object result = mi.Invoke(o, new object[] { input }); return result.ToString(); } protected void btn_Post_Click(object sender, EventArgs e) { this.l_Info.Text = PageDecryptString(HttpUtility.UrlDecode(tb_WebResourceDValue.Text)); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <form id="form1" runat="server"> <asp:TextBox ID="tb_WebResourceDValue" runat="server" /><br /> <asp:Label ID="l_Info" runat="server" /><br /> <asp:Button ID="btn_Post" runat="server" Text="計算" OnClick="btn_Post_Click" /> </form> </body> </html>
我們在 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config 文件中,可以看到 WebResource.axd 文件是配置的通過下面 HttpHandle 來解析的:
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True"/>
在? System.Web.Handlers.AssemblyResourceLoader 類中,使用 Reflector 工具看,又可以看到下面代碼:
?
void IHttpHandler.ProcessRequest(HttpContext context) { // ... string str = context.Request.QueryString["d"]; // .... string str2 = Page.DecryptString(str); // ... }顯然, d 的參數(shù), 是應(yīng)該通過 Page.DecryptString 函數(shù)來解析的。
而 Page.DecryptString 函數(shù) 中,涉及到調(diào)用 web 配置中配置的默認(rèn)加密key。 簡單起見,我們這里的解析方法就用 ASP.net 頁面來實現(xiàn)了。由于 Page.DecryptString 函數(shù)是 internal static 的, 我們上面代碼就用反射來調(diào)用這個函數(shù),就會獲得我們期望的值。
(為了保證解密算法的解密key一致,最簡單的做法就是我們把上面這個解密ASPX頁面跟需要解析的放在同一個服務(wù)器上)
上面 的? QfRKDnWw93T08KaF3ioSKQ2? 解密的結(jié)果是: s|WebForms.js?? 豎線只是用于分隔字符串中不同的值。“s”表示該數(shù)據(jù)為腳本,“WebForms.js”是要檢索的資源名稱。WebForms.js 資源可從 System.Web.dll 檢索。
同理上面 的 9iVKU5SS0wd5al1SYg8zjL8XXbP97LbENHerY4aLtJk1 解密的結(jié)果是 : s|WebUIValidation.js
顯然如果出現(xiàn)這樣的 WebResource.axd 調(diào)用,應(yīng)該是驗證控件在調(diào)用.
我們要想上面的
<script src="/WebResource.axd?d=QfRKDnWw93T08KaF3ioSKQ2&t=633313193233609691" type="text/javascript"></script>
<script src="/WebResource.axd?d=9iVKU5SS0wd5al1SYg8zjL8XXbP97LbENHerY4aLtJk1&t=633313193233609691" type="text/javascript"></script>
?
參考資料:
全球化就緒: 和 ASP.NET AJAX 應(yīng)用程序環(huán)游地球 -- MSDN Magazine, January 2008
http://msdn.microsoft.com/msdnmag/issues/08/01/InternationalizingASPNETAJAX/default.aspx?loc=zh
對于Asp.Net 2.0中腳本資源的研究(1)
http://www.cnblogs.com/Truly/archive/2007/07/07/809576.html
對于Asp.Net 2.0中腳本資源的研究(2)
http://www.cnblogs.com/Truly/archive/2007/07/10/812707.html
?
?
?
<DefaultProperty("Text"), ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")> 是什么意思?
DefaultProperty???? 是設(shè)置控件默認(rèn)的屬性的。這里是其Text屬性。就是當(dāng)你選擇這個控件的時候,在屬性窗口中自動被選中的是Text屬性。???
????
??? ToolBoxData 的意思是當(dāng)你將這個控件從tool???? box???? 中拖放到WEBFORM中時在aspx文件的???? HTML代碼中添加的對該控件的定義。
這里面的{0}表示什么意思?
控件的標(biāo)記的前綴
就是你托這個控件到頁面上 時候
他就自動添加<{0}:Div runat=server></{0}:Div>
這個{0}是你定義的
?
轉(zhuǎn)載于:https://www.cnblogs.com/skywang/articles/1364685.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的使用ASP.NET 2.0提供的WebResource管理资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 内存模型和 JVM 内存结构真
- 下一篇: 循环链表的插入和删除