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

baacloud免费翻墙vpn注册使用

[转载]更灵活,更易维护的WebHandler之通用webHandler编码方案(2) – 刘铭.net-OPS.cc – 博客园.

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

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

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

实现代码如下:

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

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

01 namespace AtNet.Web.Tools
02 {
03 using System;
04 using System.Reflection;
05
06 public class WebHandler:AtNet.Web.ExecuteHandler
07 {
08 static WebHandler()
09 {
10 _type = typeof(WebHandler);
11 }
12 }
13 }

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

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏