• 更灵活,更易维护的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执行类库里的任何类!

    代码:WebExecuteAttribute.cs
    namespace HuiShi.Web
    {
        using System;
        [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=true)]
        public class WebExecuteAttribute : Attribute{}
        }
    
    }
    东方网新,为您提供专业的网站建设,软件开发,网络营销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)

  • 相关阅读:
    Javaweb中的监听器
    Maven
    Ajax
    jQuery
    Spring入门
    spring boot实战——微信点餐系统02:接口信息,分页工具,gson, 注解信息,表单验证,字段返回(时间处理,null处理)
    Nginx
    Spring Data JPA
    spring boot实战——微信点餐系统01:开始代码
    spring boot实战——微信点餐系统00:项目设计,环境搭建
  • 原文地址:https://www.cnblogs.com/newmin/p/web_handler.html
Copyright © 2020-2023  润新知