更灵活,更易维护的WebHandler之通用webHandler编码方案(1)
2010-09-29 19:19
162 查看
文章转自我的个人博客: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执行类库里的任何类!
东方网新,为您提供专业的网站建设,软件开发,网络营销SEO,网络推广服务,代理国外主机空间,域名注册,服务热线:(+86)18608275575,电子邮件:master#atnet.cc;欢迎您访问东方网新网站:www.atnet.cc
然后我们创建1个WebHandler将其Class设为”HuiShi.Web.ExecuteHandler”,再在ExecuteHandler命名空间下创建几个类,并用[WebExecute]特性修饰,这样我们只需要加代码而不用加文件就可以完成操作了!是不是省了很多功夫,将使用WebHandler请求的类放到1个文件中集中管理,不是方便了代码组织管理吗?
想想上面的实现,没什么错误,但如果我们要将WebHandler封装成一个动态链接库,引用到其他项目的话呢?
具体实现请浏览:更灵活,更易维护的WebHandler之通用webHandler编码方案(2)
原创文章转载请标明出处:更灵活,更易维护的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执行类库里的任何类!
东方网新,为您提供专业的网站建设,软件开发,网络营销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后的为方法的参数 实际上执行的代码为:namespace HuiShi.Web { using System; using System.Web; [WebExecute] public class IPQuery { public string GetNameByAddress(string address) { return “newmin’s website www.atnet.cc“; } } }
在代码中通过”,”来将参数传给方法,并判断方法的返回值是否可以输出到页面,可以的话就输出到页面!
代码: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
}
}
东方网新,为您提供专业的网站建设,软件开发,网络营销SEO,网络推广服务,代理国外主机空间,域名注册,服务热线:(+86)18608275575,电子邮件:master#atnet.cc;欢迎您访问东方网新网站:www.atnet.cc
然后我们创建1个WebHandler将其Class设为”HuiShi.Web.ExecuteHandler”,再在ExecuteHandler命名空间下创建几个类,并用[WebExecute]特性修饰,这样我们只需要加代码而不用加文件就可以完成操作了!是不是省了很多功夫,将使用WebHandler请求的类放到1个文件中集中管理,不是方便了代码组织管理吗?
想想上面的实现,没什么错误,但如果我们要将WebHandler封装成一个动态链接库,引用到其他项目的话呢?
具体实现请浏览:更灵活,更易维护的WebHandler之通用webHandler编码方案(2)
原创文章转载请标明出处:更灵活,更易维护的WebHandler之通用webHandler编码方案(1)
相关文章推荐
- 更灵活,更易维护的WebHandler之通用webHandler编码方案(2)
- Web编码乱码解决原理方案
- 两种读写配置文件的方案(app.config与web.config通用)
- Web UTF-8编码传给服务器后乱码:中英文支持技术方案
- 基于Web的通用BBS系统的建立与维护
- 现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个是功能通用,不仅Android可以用,iOS也可
- web集群全局唯一request id生成算法, 替代uuid等“通用”方案
- 两种读写配置文件的方案(app.config与web.config通用)
- 以分布式信息流控制维护Web安全
- org.springframework.web.servlet.DispatcherServlet noHandlerFound 警告: No mapping found for HTTP reque
- 三种主流的Web服务实现方案简述及比较
- Web-----乱码--编码问题
- 让浏览器进行跨域访问, 开发阶段需要跨域访问的测试方案 chrome的快捷方式里面 加 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --args --disable-web-security
- 调用IE内置打印组件完成web打印方案及例程 (10.28)
- 利用XML实现通用WEB报表打印
- OpenERP 自动编码去BOM(可用excel编辑)web-import-chardet
- 一个命令搞定Java Web通用添删改查及分页代码生成(音视频)
- 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法
- 利用XML实现通用WEB报表打印
- 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法