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

baacloud免费翻墙vpn注册使用

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

一般处理程序(.ashx)比Web窗体文件(.aspx)性能更好,再不涉及到html的场景中经常用到!

通过VS创建的ashx文件包括代码后置文件,而实际上在ashx文件中定义只需要声明Web Handler并添加class

如: <%@ WebHandler Class=”Web.Handler” %>

我们可以在项目里面创建一个实现IHttpHandler接口的类,然后将ashx文件class设为该类的名称,这样维护起来是不是更方便?

大多数的同学可能就直接在IHttpHandler的ProccessRequest(HttpContext context)方法中添加自己的代码了,但如果网站包含50个ashx文件的话又会怎么样呢?下面我来阐述一个思路

我们是否可以将要请求的代码包含在一个个的类里,然后在ProccessRequest方法里利用反射技术执行代码就好了呢?

反射,程序员的快乐!

下面我们一步一步开始实现我们的想法:

首先我们需要为被执行代码添加授权,表明他能通过WebHandler执行,要不然就能通过WebHandler执行类库里的任何类!

1 代码:WebExecuteAttribute.cs
2 namespace HuiShi.Web
3 {
4 using System;
5 [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=true)]
6 public class WebExecuteAttribute : Attribute{}
7 }
8
9 }
东方网新,为您提供专业的网站建设,软件开发,网络营销SEO,网络推广服务,代理国外主机空间,域名注册,服务热线:(+86)18608275575,电子邮件:master#atnet.cc;欢迎您访问东方网新网站:www.atnet.cc

下面该是反射技术大展神手的时候了!先说明一下我们请求的URI格式如下:

http://localhost:11080/exc.ashx?cmd=IPQuery,GetNameByAddress,127.0.0.1

参数以”,”格开,IPQuery为类,GetNameByAddress为IPQuery的方法,GetNameByAddress后的为方法的参数

实际上执行的代码为:

01 namespace HuiShi.Web
02 {
03 using System;
04 using System.Web;
05
06 [WebExecute]
07 public class IPQuery
08 {
09 public string GetNameByAddress(string address)
10 {
11 return “newmin’s website www.atnet.cc“;
12 }
13 }
14 }

在代码中通过”,”来将参数传给方法,并判断方法的返回值是否可以输出到页面,可以的话就输出到页面!

01 代码:ExecuteHandler.cs
02
03 namespace HuiShi.Web
04 {
05 using System;
06 using System.Web;
07 using System.Reflection;
08 using System.Collections.Generic;
09
10 public class ExecuteHandler : IHttpHandler
11 {
12
13 #region IHttpHandler 成员
14 public bool IsReusable{ get; set; }
15 public void ProcessRequest(HttpContext context)
16 {
17 string cmd=context.Request["cmd"].Replace(“+”,” “); //将空格做为+号替换
18
19 string[] args = cmd.Split(‘,’);
20 if (args.Length > 2)
21 {
22 //获取执行当前代码的程序集并创建实例
23 Assembly ass = Assembly.GetAssembly(this.GetType());
24 object obj = ass.CreateInstance(this.GetType().Namespace+”.”+args[0], true);
25
26 //获取实例类型
27 Type type=obj.GetType();
28
29 //未添加WebExecuteAttribute特性的类将不被执行
30 object[] attrs= type.GetCustomAttributes(typeof(WebExecuteAttribute), false);
31 WebExecuteAttribute attr =attrs.Length>0?attrs[0] as WebExecuteAttribute:null;
32 if (attr == null) { context.Response.Write(“此模块不允许被执行!”); return; }
33
34 //获取方法并执行
35 MethodInfo method =type.GetMethod(args[1],BindingFlags.Instance|BindingFlags.Public|BindingFlags.IgnoreCase);
36 object returnObj=method.GetParameters() != null?method.Invoke(obj,cmd.Substring(args[0].Length + args[1].Length + 2).Split(‘,’))
37 :method.Invoke(obj, null);
38
39 //如国返回String类型或值类型则输出到页面
40 if (method.ReturnType == typeof(string) ||obj is ValueType)
41 context.Response.Write(returnObj.ToString());
42 }
43 }
44
45 #endregion
46 }
47 }
东方网新,为您提供专业的网站建设,软件开发,网络营销SEO,网络推广服务,代理国外主机空间,域名注册,服务热线:(+86)18608275575,电子邮件:master#atnet.cc;欢迎您访问东方网新网站:www.atnet.cc

然后我们创建1个WebHandler将其Class设为”HuiShi.Web.ExecuteHandler”,再在 ExecuteHandler命名空间下创建几个类,并用[WebExecute]特性修饰,这样我们只需要加代码而不用加文件就可以完成操作了!是不是 省了很多功夫,将使用WebHandler请求的类放到1个文件中集中管理,不是方便了代码组织管理吗?

想想上面的实现,没什么错误,但如果我们要将WebHandler封装成一个动态链接库,引用到其他项目的话呢?

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

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

支付宝扫一扫打赏

微信扫一扫打赏