网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

更灵活,更易维护的WebHandler之通用webHandler编码方案(2)

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

上一篇:更灵活,更易维护的WebHandler之通用webHandler编码方案(1) 中介绍了在同一个程序集中使用webHandler执行类的方法,

但在多数情况下,我们会将WebHandler封装进一个单独的动态链接库,我们需要将引用WebHandler DLL的程序集或程序集中的任意一个类的Type做为参数传递给WebHandler,

这样就可以在WebHandler中利用反射调用引用WebHandler类库的程序集中的代码!

实现代码如下:

  1. /* * 
  2.  * name     : ExecuteHandler.cs  
  3.  * author   : newmin 
  4.  * date     : 09/29 2010 
  5.  * note     : 用来处理请求,请求的URI参数如:Exc.ashx?cmd=IP,GetIP,127.0.0.1 
  6.  *  
  7.  * 要执行操作的类必需要程序集名称命名空间下: 
  8.  * 如要执行AtNet.Security下的User类,则User类的命名空间为:HuiShi.Security.User 
  9.  * 调用方式**.ashx?cmd=User,GetScore,newmin 
  10.  *  
  11.  * */ 
  12. namespace AtNet.Web 
  13.     using System; 
  14.     using System.Web; 
  15.     using System.Reflection; 
  16.     using System.Collections.Generic; 
  17.  
  18.     public abstract class ExecuteHandler : IHttpHandler 
  19.     { 
  20.         //绑定类型用于获取程序集,只能在子类的静态构造函数中赋值 
  21.         protected static Type _type; 
  22.         #region IHttpHandler 成员 
  23.         public bool IsReusable{ getset; } 
  24.          
  25.         public void ProcessRequest(HttpContext context) 
  26.         { 
  27.             string cmd=context.Request["cmd"].Replace("+"," ");         //将空格做为+号替换 
  28.  
  29.             string args = cmd.Split(','); 
  30.             if (args.Length > 2) 
  31.             { 
  32.                 //获取执行当前代码的程序集并创建实例 
  33.                Assembly ass = Assembly.GetAssembly(_type); 
  34.                 object obj = ass.CreateInstance(_type.Namespace+"."+args[0], true); 
  35.  
  36.                 //获取实例类型 
  37.                 Type type=obj.GetType(); 
  38.  
  39.                 //未添加WebExecuteAttribute特性的类将不被执行 
  40.                 object attrs= type.GetCustomAttributes(typeof(WebExecuteAttribute), false); 
  41.                 WebExecuteAttribute attr =attrs.Length>0?attrs[0] as WebExecuteAttribute:null
  42.                 if (attr == null) { context.Response.Write("此模块不允许被执行!"); return; } 
  43.  
  44.                 //获取方法并执行 
  45.                 MethodInfo method =type.GetMethod(args,BindingFlags.Instance|BindingFlags.Public|BindingFlags.IgnoreCase); 
  46.                 object returnObj=method.GetParameters() != null?method.Invoke(obj,cmd.Substring(args[0].Length + args.Length + 2).Split(',')) 
  47.                         :method.Invoke(obj, null); 
  48.  
  49.                 //如国返回String类型或值类型则输出到页面 
  50.                 if (method.ReturnType == typeof(string) ||obj is ValueType) 
  51.                     context.Response.Write(returnObj.ToString()); 
  52.             } 
  53.         } 
  54.  
  55.         #endregion 
  56.     } 

 

我们需在继承ExecuteHandler的类的静态构造函数中对_type赋值:

  1. namespace AtNet.Web.Tools 
  2.     using System; 
  3.     using System.Reflection; 
  4.  
  5.     public class WebHandler:AtNet.Web.ExecuteHandler 
  6.     { 
  7.         static WebHandler() 
  8.         { 
  9.            _type = typeof(WebHandler); 
  10.        } 
  11.     } 

 

 这样我们就能在将ExecuteHandler分离出来,被别的项目所引用

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师