(地址轉義:指像http://thinhunan.cnblogs.com/這樣的地址,被轉義成http://www.cnblogs.com/default.aspx頁(yè)面處理,default.aspx頁(yè)面在URL中獲得參數:BlogName = thinhunan。)
Dottext博客程序用IHttpHandler myhandler= PageParser.GetCompiledPageInstance (url,pagepath,context)來(lái)進(jìn)行地址轉義,這個(gè)方法返回的IHttpHandler的屬性IsReusable有時(shí)會(huì )等于True,就是說(shuō)返回的Handler會(huì )被Cache,我們在做Dottext的擴展時(shí)(如二級域名),這個(gè)機制不會(huì )出現什么問(wèn)題,這是因為其實(shí)Dottext中很多種的URL都是最終給一個(gè)頁(yè)面來(lái)處理,那就是能動(dòng)態(tài)加載Control完成各種變化的Default.aspx頁(yè)面,但如果有以下情況,問(wèn)題就出來(lái)了:
1、http://thinhunan.sjjjyz.com/blog 和 http://www.sjjyz.com/blog 要由不同的aspx文件,也就是不同的類(lèi)來(lái)處理時(shí)
2、http://thinhunan.sjjyz.com/blog/2005/10/27/234.html 和 http://thinhunan.sjjyz.com/blog/2005/10/27/234.html?comment=1 要由不同的類(lèi)來(lái)處理時(shí)
3、同是http://thinhunan.sjjjyz.com/blog ,但要根據客戶(hù)端是IE還是手機由不同的類(lèi)處理時(shí)
問(wèn)題就出來(lái)了,因為Caching在緩存IHttpHandler時(shí),Key根據的是Request的Path(或者FilePath)信息,就是說(shuō),不管是上面的第一種還是第二種情況,IHttpHandler會(huì )錯誤的看成是可以重用緩存中的前一次有細微不同的URL生成的IHttpHandler,而第三種情況,在我們的IHttpHandlerFactory類(lèi)中,判斷客戶(hù)端的動(dòng)作也不會(huì )執行,因為HttpModules會(huì )在HttpHandlers之前進(jìn)行動(dòng)作,而在Machine.config文件中





Cache是第一個(gè)HttpModule,所以,如果第一次是用戶(hù)用手機訪(fǎng)問(wèn)了你的首頁(yè),那以后用IE來(lái)訪(fǎng)問(wèn)的IE都會(huì )被送上一堆不能解析的WML代碼。
由此可見(jiàn),PageParser.GetCompilePageInstance()方法也許并不能滿(mǎn)足我們的需求。那怎么辦呢?
對System.Web.UI進(jìn)行改進(jìn)和擴展?這是行不通的,因為其中大部分類(lèi)、方法都是internal的,不同Assembly不能訪(fǎng)問(wèn)。
可行的辦法是:其實(shí)System.Web.UI.Page本身繼承了IHttpHandler,而且它本身的IsReusable返回的是false,既然如此,那我們干脆只接用反射返回頁(yè)面實(shí)例就行了,實(shí)現代碼如下:















































-----------------------------------------
原創(chuàng )文章,轉載請注明出處

