基于IHttpHandler 的非标准webapi

基于IHttpHandler 的非标准webapi

此篇文章是本菜鸟对于公司大神自研框架的研究,也就是扒代码…
如有不足请指出

先举个栗子,在命名空间ABC.WebSiteAPI下有SystemUserAPIAPI类,类中有Create这个方法

namespace ABC.WebSiteAPI
{
    public class SystemUserAPI
    {
        public static void Create(string name)
        {
        		//balabala
        }
      }
  }   

想要做到通过这个链接可以响应上述方法
http://localhost/API/SystemUser/Create?name=xxx

1.web.config中定义handlers,可以路由到对应的程序集和类
而这个类就是继承IHttpHandler的自定义handel,入口

<system.webServer>
    <handlers>
      <add name="WebSiteAPI" verb="*" path="/API/*" type="ABC.APIHandle,ABC"/>
    </handlers>
  </system.webServer>

2.所有接口都写在同一个程序集下,本例就是ABC.WebSiteAPI,初始化时加载该程序集下的所有类(Assembly类的多种静态Load方法加载程序集),例如SystemUserAPI…,存入字典项

3.入口handle类中,获取响应的httpcontext,获得请求的类名,方法名,参数

4.验证之前初始化的字典项中是否存在请求的类名(在类名中找是否存在SystemUserAPI)
找到对应的类名,即可获得类下的所有方法
验证请求的方法名是否在上述所有方法中(查找是否存在Create)
5.参数
找到对应的方法后,可以通过MethodInfo.GetParameters()获取参数(这里是方法本身的参数,而不是请求的参数)
循环参数,验证对应的请求中是否合法(如非空,类型不匹配之类的)并封装成object数组。记得要转换成对应的类型用Convert.ChangeType,部分代码如下

        private object GetParmValueFromRequest(ParameterInfo parm)
        {
            var parmValue = Context.Request[parm.Name];
            var parmType = parm.ParameterType;

            if (parmType == typeof(string)) return parmValue;

            if (string.IsNullOrEmpty(parmValue)) // 如参数未定义,返回null
            {
                if (parmType.IsGenericType && parmType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
                    return null;  // 判断参数类型是否为Nullable
            }

            try
            {
                if (parmType.IsPrimitive)                                 // 如参数为基元类型,进行类型转换
                    return Convert.ChangeType(parmValue, parmType);

                if (parmType == typeof(Guid)) return Guid.Parse(parmValue);
                if (parmType == typeof(DateTime)) return DateTime.Parse(parmValue);

                return Json.Deserialize(parmValue, parmType);             // 如果参数为自定义对象,根据字符串反序列化出对象,该方法是自己封装的
            }
            catch (Exception ex)
            {
                return null;
            }
        }

6.调用方法
方法.Invoke(实例, 参数);
就可以啦

以上就是根据代码自己所总结的步骤和思路啦
应用场景,频繁的与移动端做交互,MVC显的太过臃肿,那目前webapi又没有与mvc做分割,所以用IHttpHandler结合反射,做的一个轻量的框架

猜你喜欢

转载自blog.csdn.net/yanxiaozai/article/details/82999448