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

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

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

一般处理程序(.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执行类库里的任何类!

代码:WebExecuteAttribute.cs

  1. namespace HuiShi.Web 
  2.     using System; 
  3.     [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=true)] 
  4.     public class WebExecuteAttribute : Attribute{} 
  5.     } 
  6.  

下面该是反射技术大展神手的时候了!先说明一下我们请求的URI格式如下:
http://localhost:11080/exc.ashx?cmd=IPQuery,GetNameByAddress,127.0.0.1

参数以”,”格开,IPQuery为类,GetNameByAddress为IPQuery的方法,GetNameByAddress后的为方法的参数
实际上执行的代码为:

  1. namespace HuiShi.Web 
  2.     using System; 
  3.     using System.Web; 
  4.  
  5.     [WebExecute] 
  6.     public class IPQuery 
  7.     { 
  8.         public string GetNameByAddress(string address) 
  9.         { 
  10.             return “newmin’s website www.atnet.cc“; 
  11.         } 
  12.     } 

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

代码:ExecuteHandler.cs

  1. namespace HuiShi.Web 
  2.     using System; 
  3.     using System.Web; 
  4.     using System.Reflection; 
  5.     using System.Collections.Generic; 
  6.  
  7.     public  class ExecuteHandler : IHttpHandler 
  8.     { 
  9.  
  10.         #region IHttpHandler 成员 
  11.       public bool IsReusable{ getset; } 
  12.         public void ProcessRequest(HttpContext context) 
  13.         { 
  14.             string cmd=context.Request["cmd"].Replace(“+”,” “);         //将空格做为+号替换 
  15.  
  16.             string args = cmd.Split(‘,’); 
  17.             if (args.Length > 2) 
  18.             { 
  19.                 //获取执行当前代码的程序集并创建实例 
  20.                 Assembly ass = Assembly.GetAssembly(this.GetType()); 
  21.                 object obj = ass.CreateInstance(this.GetType().Namespace+”.”+args[0], true); 
  22.  
  23.                 //获取实例类型 
  24.                 Type type=obj.GetType(); 
  25.  
  26.                 //未添加WebExecuteAttribute特性的类将不被执行 
  27.                 object attrs= type.GetCustomAttributes(typeof(WebExecuteAttribute), false); 
  28.                 WebExecuteAttribute attr =attrs.Length>0?attrs[0] as WebExecuteAttribute:null
  29.                 if (attr == null) { context.Response.Write(“此模块不允许被执行!”); return; } 
  30.  
  31.                 //获取方法并执行 
  32.                 MethodInfo method =type.GetMethod(args,BindingFlags.Instance|BindingFlags.Public|BindingFlags.IgnoreCase); 
  33.                 object returnObj=method.GetParameters() != null?method.Invoke(obj,cmd.Substring(args[0].Length + args.Length + 2).Split(‘,’)) 
  34.                         :method.Invoke(obj, null); 
  35.  
  36.                 //如国返回String类型或值类型则输出到页面 
  37.                 if (method.ReturnType == typeof(string) ||obj is ValueType) 
  38.                     context.Response.Write(returnObj.ToString()); 
  39.             } 
  40.         } 
  41.  
  42.         #endregion 
  43.     } 

 

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

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

 

具体实现请浏览:更灵活,更易维护的WebHandler之通用webHandler编码方案(2)

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