更灵活,更易维护的WebHandler之通用webHandler编码方案(1)
文章转自我的个人博客:http://blog.atnet.cc/dotnet/ashx_best_web_handler/
一般处理程序(.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 2 3 4 5 6 7 8 9 | 代码:WebExecuteAttribute.cs namespace HuiShi.Web { using System; [AttributeUsage(AttributeTargets.Class,AllowMultiple= false ,Inherited= true )] public class WebExecuteAttribute : Attribute{} } } |
下面该是反射技术大展神手的时候了!先说明一下我们请求的URI格式如下:
http://localhost:11080/exc.ashx?cmd=IPQuery,GetNameByAddress,127.0.0.1
参数以”,”格开,IPQuery为类,GetNameByAddress为IPQuery的方法,GetNameByAddress后的为方法的参数
实际上执行的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace HuiShi.Web { using System; using System.Web; [WebExecute] public class IPQuery { public string GetNameByAddress( string address) { return “newmin’s website www.atnet.cc“; } } } |
在代码中通过”,”来将参数传给方法,并判断方法的返回值是否可以输出到页面,可以的话就输出到页面!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 代码:ExecuteHandler.cs namespace HuiShi.Web { using System; using System.Web; using System.Reflection; using System.Collections.Generic; public class ExecuteHandler : IHttpHandler { #region IHttpHandler 成员 public bool IsReusable{ get ; set ; } public void ProcessRequest(HttpContext context) { string cmd=context.Request[ "cmd" ].Replace(“+”,” “); //将空格做为+号替换 string [] args = cmd.Split(‘,’); if (args.Length > 2) { //获取执行当前代码的程序集并创建实例 Assembly ass = Assembly.GetAssembly( this .GetType()); object obj = ass.CreateInstance( this .GetType().Namespace+”.”+args[0], true ); //获取实例类型 Type type=obj.GetType(); //未添加WebExecuteAttribute特性的类将不被执行 object [] attrs= type.GetCustomAttributes( typeof (WebExecuteAttribute), false ); WebExecuteAttribute attr =attrs.Length>0?attrs[0] as WebExecuteAttribute: null ; if (attr == null ) { context.Response.Write(“此模块不允许被执行!”); return ; } //获取方法并执行 MethodInfo method =type.GetMethod(args[1],BindingFlags.Instance|BindingFlags.Public|BindingFlags.IgnoreCase); object returnObj=method.GetParameters() != null ?method.Invoke(obj,cmd.Substring(args[0].Length + args[1].Length + 2).Split(‘,’)) :method.Invoke(obj, null ); //如国返回String类型或值类型则输出到页面 if (method.ReturnType == typeof ( string ) ||obj is ValueType) context.Response.Write(returnObj.ToString()); } } #endregion } } |
然后我们创建1个WebHandler将其Class设为”HuiShi.Web.ExecuteHandler”,再在ExecuteHandler命名空间下创建几个类,并用[WebExecute]特性修饰,这样我们只需要加代码而不用加文件就可以完成操作了!是不是省了很多功夫,将使用WebHandler请求的类放到1个文件中集中管理,不是方便了代码组织管理吗?
想想上面的实现,没什么错误,但如果我们要将WebHandler封装成一个动态链接库,引用到其他项目的话呢?
具体实现请浏览:更灵活,更易维护的WebHandler之通用webHandler编码方案(2)
原创文章转载请标明出处:更灵活,更易维护的WebHandler之通用webHandler编码方案(1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述