Asp.net地址转义(分析)加强版--Dottext的地址分析模块的不足之处及相应的解决方案

(地址转义:指像http://www.cnblogs.com/default.aspx页面处理,default.aspx页面在URL中获得参数:BlogName = thinhunan。)

Dottext博客程序用IHttpHandler myhandler= PageParser.GetCompiledPageInstance (url,pagepath,context)来进行地址转义,这个方法返回的IHttpHandler的属性IsReusable有时会等于True,就是说返回的Handler会被Cache,我们在做Dottext的扩展时(如二级域名),这个机制不会出现什么问题,这是因为其实Dottext中很多种的URL都是最终给一个页面来处理,那就是能动态加载Control完成各种变化的Default.aspx页面,但如果有以下情况,问题就出来了:
1、http://thinhunan.sjjjyz.com/bloghttp://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 ,但要根据客户端是IE还是手机由不同的类处理时

问题就出来了,因为Caching在缓存IHttpHandler时,Key根据的是Request的Path(或者FilePath)信息,就是说,不管是上面的第一种还是第二种情况,IHttpHandler会错误的看成是可以重用缓存中的前一次有细微不同的URL生成的IHttpHandler,而第三种情况,在我们的IHttpHandlerFactory类中,判断客户端的动作也不会执行,因为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,既然如此,那我们干脆只接用反射返回页面实例就行了,实现代码如下:

        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;
        }


-----------------------------------------
原创文章,转载请注明出处

posted @ 2005-11-03 15:55 Lyn 阅读(4151) 评论(13)  编辑 收藏 所属分类: ASP.net

  回复  引用    
#1楼 2005-11-03 16:03 | 匿了 [未注册用户]
哇塞!!!~~~~~

老大,实在太帅了!

竟然写出这样让人叹为观止的材料~

偶是来拜老大的!你永远是偶滴老大!

加油~~

永远支持你的粉丝...

  回复  引用  查看    
#2楼 2005-11-03 16:05 | 非非.Net      
地址转义? 应该是URL重写
  回复  引用  查看    
#3楼 [楼主]2005-11-03 16:08 | THIN      
URL重写也行,URL重写主要是对应有个方法
System.Web.HttpContext.Current.RewritePath()中文翻译刚好是地址重写
  回复  引用  查看    
#4楼 [楼主]2005-11-03 16:08 | THIN      
而且GetCompiledInstance本来也没有重写这个"动作"啊
  回复  引用  查看    
#5楼 2005-11-03 16:23 | dudu      
好方法!
文章题目长了点, 影响了首页的显示。
  回复  引用  查看    
#6楼 [楼主]2005-11-03 16:47 | THIN      
题目已做删节,呵呵
  回复  引用  查看    
#7楼 2005-11-03 17:05 | jigee      
够经典
  回复  引用  查看    
#8楼 2005-11-04 12:57 | Jwin      
呵呵
好多问题都能在你这找到答案
不错
经典!
  回复  引用    
#9楼 2005-11-06 12:11 | jiniboy [未注册用户]
大哥的blog总是湿漉漉的,是不是水性很好啊,logo的图片是不是泳衣阿:-D
  回复  引用    
#10楼 2005-11-09 09:29 | 匿了 [未注册用户]
2005-11-06 12:11 | jiniboy

大哥的blog总是湿漉漉的,是不是水性很好啊,logo的图片是不是泳衣阿:-D


(形容夸张,但基本上情况属实)同意楼上意见~

:)
  回复  引用    
#11楼 2006-03-24 16:25 | yukai zhao [未注册用户]
好方法
  回复  引用    
#12楼 2006-06-30 07:06 | mentor [未注册用户]
能否指点一下,向http://thinhunan.sjjyz.com/blog/2005/10/27/234.html 这样的URL是怎么生成的? 在用VS2003的时候,我想由数据库提取数据绑定到 HTML 控件或者 HyperLink 控件的HREF 属性,可是没办法实现。 查找资料,发现好象只可以在LIST 控件内部才可以绑定。不过也有说可以把数据直接绑定到PAGE,也可以绑定到单独的URL属性,不知道怎么实现? 谢谢!
  回复  引用    
#13楼 2007-03-20 15:05 | ede [未注册用户]
nn那```
写的什么啊?

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-08-22 14:18 编辑过
成果网帮您增加网站收入


相关链接: