(地址轉(zhuǎn)義:指像http://thinhunan.cnblogs.com/這樣的地址,被轉(zhuǎn)義成http://www.cnblogs.com/default.aspx頁面處理,default.aspx頁面在URL中獲得參數(shù):BlogName = thinhunan。)
Dottext博客程序用IHttpHandler myhandler= PageParser.GetCompiledPageInstance (url,pagepath,context)來進行地址轉(zhuǎn)義,這個方法返回的IHttpHandler的屬性IsReusable有時會等于True,就是說返回的Handler會被Cache,我們在做Dottext的擴展時(如二級域名),這個機制不會出現(xiàn)什么問題,這是因為其實Dottext中很多種的URL都是最終給一個頁面來處理,那就是能動態(tài)加載Control完成各種變化的Default.aspx頁面,但如果有以下情況,問題就出來了:
1、http://thinhunan.sjjjyz.com/blog 和 http://www.sjjyz.com/blog 要由不同的aspx文件,也就是不同的類來處理時
2、http://thinhunan.sjjyz.com/blog/2005/10/27/234.html 和 http://thinhunan.sjjyz.com/blog/2005/10/27/234.html?comment=1 要由不同的類來處理時
3、同是http://thinhunan.sjjjyz.com/blog ,但要根據(jù)客戶端是IE還是手機由不同的類處理時
問題就出來了,因為Caching在緩存IHttpHandler時,Key根據(jù)的是Request的Path(或者FilePath)信息,就是說,不管是上面的第一種還是第二種情況,IHttpHandler會錯誤的看成是可以重用緩存中的前一次有細微不同的URL生成的IHttpHandler,而第三種情況,在我們的IHttpHandlerFactory類中,判斷客戶端的動作也不會執(zhí)行,因為HttpModules會在HttpHandlers之前進行動作,而在Machine.config文件中
<httpModules>
<add
name="OutputCache"
type="System.Web.Caching.OutputCacheModule" />
…… </httpModules> Cache是第一個HttpModule,所以,如果第一次是用戶用手機訪問了你的首頁,那以后用IE來訪問的IE都會被送上一堆不能解析的WML代碼。
由此可見,PageParser.GetCompilePageInstance()方法也許并不能滿足我們的需求。那怎么辦呢?
對System.Web.UI進行改進和擴展?這是行不通的,因為其中大部分類、方法都是internal的,不同Assembly不能訪問。
可行的辦法是:其實System.Web.UI.Page本身繼承了IHttpHandler,而且它本身的IsReusable返回的是false,既然如此,那我們干脆只接用反射返回頁面實例就行了,實現(xiàn)代碼如下:
private static Assembly _dotTextWebAssembly = null;
/**//// <summary>
/// Assembly
/// </summary> private static Assembly DotTextWebAssembly
{
get
{
if(_dotTextWebAssembly == null)
{
_dotTextWebAssembly = (Assembly)HttpRuntime.Cache["WebDllPath"];
if(_dotTextWebAssembly == null)
{
AssemblyName an = new AssemblyName();
an.Name = "Dottext.Web";
_dotTextWebAssembly = AppDomain.CurrentDomain.Load(an);
HttpRuntime.Cache.Insert("WebDllPath",_dotTextWebAssembly,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromDays(1),System.Web.Caching.CacheItemPriority.NotRemovable,null);
}
}
return _dotTextWebAssembly;
}
}
private static IHttpHandler GetWapHandlerByPage(string pageName)
{
IHttpHandler waphandler = null;
//waphandler = (IHttpHandler)HttpRuntime.Cache["WapHandler_"+pageName]; 此處不能用Cache,因為Handler的IsReUsable為false;
//if(waphandler == null)
//{
Type type = DotTextWebAssembly.GetType("Dottext.Web."+pageName.Replace(".aspx",""),true,true);
waphandler = (IHttpHandler)System.Activator.CreateInstance(type);
//HttpRuntime.Cache.Insert("WapHandler_"+pageName,waphandler,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromHours(1),System.Web.Caching.CacheItemPriority.NotRemovable,null);
//}
return waphandler;
}
-----------------------------------------
原創(chuàng)文章,轉(zhuǎn)載請注明出處
posted on 2005-11-03 15:55
THIN 閱讀(70)
評論(6) 編輯 收藏 收藏至365Key 所屬分類:
ASP.net