示例#1
0
        /// <summary>
        /// 适配器构造函数
        /// </summary>
        public Startup()
        {
            DirectoryInfo di = new DirectoryInfo(HttpHelper.GetMapPath("/bin"));

            if (!di.Exists)
            {
                di = new DirectoryInfo(HttpHelper.GetMapPath("/"));
            }
            var files = di.GetFiles("*.dll", SearchOption.AllDirectories);

            if (files != null)
            {
                Assembly assembly = null;
                foreach (var f in files)
                {
                    try
                    {
                        assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(f.FullName));
                    }
                    catch (Exception e)
                    {
                        Debug.Write(e.Message);
                        continue;
                    }
                    Type[] assemblyTypes = null;
                    try
                    {
                        assemblyTypes = assembly.GetTypes();
                    }
                    catch { Console.WriteLine("GetTypes Error!"); }
                    if (assemblyTypes != null)
                    {
                        foreach (var type in assemblyTypes)
                        {
                            if (type.IsSubclassOf(typeof(BaseRoute)))
                            {
                                try
                                {
                                    BaseRoute ir = (BaseRoute)Activator.CreateInstance(type);
                                }
                                catch (Exception e)
                                {
                                    Debug.Write(e.ToString());
                                }
                            }
                            else if (typeof(IService).IsAssignableFrom(type))
                            {
                                var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);
                                foreach (var m in methods)
                                {
                                    ParameterInfo[] param;
                                    Type            paramtype;
                                    IEnumerable <RouteAttribute>   arrts1;
                                    IEnumerable <RewriteAttribute> arrts2;
                                    Func <IOwinContext, Task>      func;
                                    bool   isdone  = false;
                                    string headers = responseheaders;
                                    arrts1 = m.GetCustomAttributes <RouteAttribute>(false);//处理函数直接注册的路由
                                    param  = m.GetParameters();
                                    if (param.Length == 1)
                                    {
                                        foreach (var routeattr in arrts1)
                                        {
                                            if (routeattr.Verbs == null)
                                            {
                                                if (!_all_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null)
                                                    {
                                                        headers = routeattr.Headers;
                                                    }
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    _all_route.Add(routeattr.Path, func);
                                                    isdone = true;
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Any路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                            else if (routeattr.Verbs == "GET")
                                            {
                                                var get_route = _verb_route["GET"];
                                                if (!get_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null)
                                                    {
                                                        headers = routeattr.Headers;
                                                    }
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    get_route.Add(routeattr.Path, func);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Get路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                            else if (routeattr.Verbs == "POST")
                                            {
                                                var post_route = _verb_route["POST"];
                                                if (!post_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null)
                                                    {
                                                        headers = routeattr.Headers;
                                                    }
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    post_route.Add(routeattr.Path, func);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Post路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                        }
                                        if (!isdone)//处理参数类路由
                                        {
                                            switch (m.Name)
                                            {
                                            case "Any":
                                                paramtype = param[0].ParameterType;
                                                arrts1    = paramtype.GetCustomAttributes <RouteAttribute>(false);
                                                foreach (var routeattr in arrts1)
                                                {
                                                    if (!_all_route.ContainsKey(routeattr.Path))
                                                    {
                                                        if (routeattr.Headers != null)
                                                        {
                                                            headers = routeattr.Headers;
                                                        }
                                                        func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                        _all_route.Add(routeattr.Path, func);
                                                    }
                                                    else
                                                    {
                                                        Debug.Write(string.Format("Any路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                    }
                                                }
                                                break;

                                            case "Get":
                                                paramtype = param[0].ParameterType;
                                                arrts1    = paramtype.GetCustomAttributes <RouteAttribute>(false);
                                                foreach (var routeattr in arrts1)
                                                {
                                                    var get_route = _verb_route["GET"];
                                                    if (!get_route.ContainsKey(routeattr.Path))
                                                    {
                                                        if (routeattr.Headers != null)
                                                        {
                                                            headers = routeattr.Headers;
                                                        }
                                                        func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                        get_route.Add(routeattr.Path, func);
                                                    }
                                                    else
                                                    {
                                                        Debug.Write(string.Format("Get路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                    }
                                                }
                                                break;

                                            case "Post":
                                                paramtype = param[0].ParameterType;
                                                arrts1    = paramtype.GetCustomAttributes <RouteAttribute>(false);
                                                foreach (var routeattr in arrts1)
                                                {
                                                    var post_route = _verb_route["POST"];
                                                    if (!post_route.ContainsKey(routeattr.Path))
                                                    {
                                                        if (routeattr.Headers != null)
                                                        {
                                                            headers = routeattr.Headers;
                                                        }
                                                        func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                        post_route.Add(routeattr.Path, func);
                                                    }
                                                    else
                                                    {
                                                        Debug.Write(string.Format("Post路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                    }
                                                }
                                                break;

                                            default:
                                                break;
                                            }
                                        }
                                        //处理伪静态路径(只判断POCO的参数类)
                                        if (m.Name == "Rewrite")
                                        {
                                            paramtype = param[0].ParameterType;
                                            arrts2    = paramtype.GetCustomAttributes <RewriteAttribute>(false);
                                            foreach (var rewriteattr in arrts2)
                                            {
                                                string[]        subpaths = rewriteattr.Path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                                                int             length   = subpaths.Length;
                                                string          pathnode;
                                                bool            isgoing = true;
                                                RewritePathNode n1, n2;
                                                n1 = _rewrite_route[length - 1];
                                                if (n1 == null)
                                                {
                                                    n1 = new RewritePathNode()
                                                    {
                                                        chindren = new Dictionary <string, RewritePathNode>()
                                                    };
                                                    _rewrite_route[length - 1] = n1;
                                                }
                                                List <Tuple <string, int> > keys = new List <Tuple <string, int> >();
                                                for (int i = 0; i < length; i++)
                                                {
                                                    pathnode = subpaths[i];
                                                    if (pathnode[0] == '{' && pathnode[pathnode.Length - 1] == '}')
                                                    {
                                                        isgoing = false;
                                                        keys.Add(new Tuple <string, int>(pathnode.Substring(1, pathnode.Length - 2), i));
                                                    }
                                                    else
                                                    {
                                                        if (isgoing)
                                                        {
                                                            if (!n1.chindren.TryGetValue(pathnode, out n2))
                                                            {
                                                                n2 = new RewritePathNode()
                                                                {
                                                                    chindren = new Dictionary <string, RewritePathNode>()
                                                                };
                                                                n1.chindren.Add(pathnode, n2);
                                                            }
                                                            n1 = n2;
                                                        }
                                                    }
                                                }
                                                if (n1.func == null)
                                                {
                                                    if (rewriteattr.Headers != null)
                                                    {
                                                        headers = rewriteattr.Headers;
                                                    }
                                                    n1.func = HttpHelper.GetOwinRewriteTask(type, paramtype, m.ReturnType, m, rewriteattr.MaxLength, headers, keys);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Rewrite路径重复注册. path:{0};param:{1};func:{2}", rewriteattr.Path, paramtype.Name, m.Name));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            var builder = new AppBuilder();

            Configuration(builder);
            _owinApp = builder.Build();
        }
示例#2
0
        /// <summary>
        /// 适配器构造函数
        /// </summary>
        public Startup()
        {
            DirectoryInfo di = new DirectoryInfo(HttpHelper.GetMapPath("/bin"));
            if (!di.Exists) di = new DirectoryInfo(HttpHelper.GetMapPath("/"));
            var files = di.GetFiles("*.dll", SearchOption.AllDirectories);
            if (files != null)
            {
                Assembly assembly = null;
                foreach (var f in files)
                {
                    try
                    {
                        assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(f.FullName));
                    }
                    catch (Exception e)
                    {
                        Debug.Write(e.Message);
                        continue;
                    }

                    var assemblyTypes = assembly.GetTypes();
                    if (assemblyTypes != null)
                    {
                        foreach (var type in assemblyTypes)
                        {
                            if (type.IsSubclassOf(typeof(BaseRoute)))
                            {
                                try
                                {
                                    BaseRoute ir = (BaseRoute)Activator.CreateInstance(type);
                                }
                                catch (Exception e)
                                {
                                    Debug.Write(e.ToString());
                                }
                            }
                            else if (typeof(IService).IsAssignableFrom(type))
                            {
                                var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);
                                foreach (var m in methods)
                                {
                                    ParameterInfo[] param;
                                    Type paramtype;
                                    IEnumerable<RouteAttribute> arrts1;
                                    IEnumerable<RewriteAttribute> arrts2;
                                    Func<IOwinContext, Task> func;
                                    bool isdone = false;
                                    string headers = responseheaders;
                                    arrts1 = m.GetCustomAttributes<RouteAttribute>(false);//处理函数直接注册的路由
                                    param = m.GetParameters();
                                    if (param.Length == 1)
                                    {
                                        foreach (var routeattr in arrts1)
                                        {
                                            if (routeattr.Verbs == null)
                                            {
                                                if (!_all_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null) headers = routeattr.Headers;
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    _all_route.Add(routeattr.Path, func);
                                                    isdone = true;
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Any路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                            else if (routeattr.Verbs == "GET")
                                            {
                                                var get_route = _verb_route["GET"];
                                                if (!get_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null) headers = routeattr.Headers;
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    get_route.Add(routeattr.Path, func);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Get路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                            else if (routeattr.Verbs == "POST")
                                            {
                                                var post_route = _verb_route["POST"];
                                                if (!post_route.ContainsKey(routeattr.Path))
                                                {
                                                    if (routeattr.Headers != null) headers = routeattr.Headers;
                                                    func = HttpHelper.GetOwinTask(type, param[0].ParameterType, m.ReturnType, m, routeattr.MaxLength, headers);
                                                    post_route.Add(routeattr.Path, func);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Post路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, param[0].ParameterType.Name, m.Name));
                                                }
                                            }
                                        }
                                        if (!isdone)//处理参数类路由
                                        {
                                            switch (m.Name)
                                            {
                                                case "Any":
                                                    paramtype = param[0].ParameterType;
                                                    arrts1 = paramtype.GetCustomAttributes<RouteAttribute>(false);
                                                    foreach (var routeattr in arrts1)
                                                    {
                                                        if (!_all_route.ContainsKey(routeattr.Path))
                                                        {
                                                            if (routeattr.Headers != null) headers = routeattr.Headers;
                                                            func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                            _all_route.Add(routeattr.Path, func);
                                                        }
                                                        else
                                                        {
                                                            Debug.Write(string.Format("Any路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                        }
                                                    }
                                                    break;
                                                case "Get":
                                                    paramtype = param[0].ParameterType;
                                                    arrts1 = paramtype.GetCustomAttributes<RouteAttribute>(false);
                                                    foreach (var routeattr in arrts1)
                                                    {
                                                        var get_route = _verb_route["GET"];
                                                        if (!get_route.ContainsKey(routeattr.Path))
                                                        {
                                                            if (routeattr.Headers != null) headers = routeattr.Headers;
                                                            func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                            get_route.Add(routeattr.Path, func);
                                                        }
                                                        else
                                                        {
                                                            Debug.Write(string.Format("Get路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                        }
                                                    }
                                                    break;
                                                case "Post":
                                                    paramtype = param[0].ParameterType;
                                                    arrts1 = paramtype.GetCustomAttributes<RouteAttribute>(false);
                                                    foreach (var routeattr in arrts1)
                                                    {
                                                        var post_route = _verb_route["POST"];
                                                        if (!post_route.ContainsKey(routeattr.Path))
                                                        {
                                                            if (routeattr.Headers != null) headers = routeattr.Headers;
                                                            func = HttpHelper.GetOwinTask(type, paramtype, m.ReturnType, m, routeattr.MaxLength, headers);
                                                            post_route.Add(routeattr.Path, func);
                                                        }
                                                        else
                                                        {
                                                            Debug.Write(string.Format("Post路径重复注册. path:{0};param:{1};func:{2}", routeattr.Path, paramtype.Name, m.Name));
                                                        }
                                                    }
                                                    break;
                                                default:
                                                    break;
                                            }
                                        }
                                        //处理伪静态路径(只判断POCO的参数类)
                                        if (m.Name == "Rewrite")
                                        {
                                            paramtype = param[0].ParameterType;
                                            arrts2 = paramtype.GetCustomAttributes<RewriteAttribute>(false);
                                            foreach (var rewriteattr in arrts2)
                                            {
                                                string[] subpaths = rewriteattr.Path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                                                int length = subpaths.Length;
                                                string pathnode;
                                                bool isgoing = true;
                                                RewritePathNode n1, n2;
                                                n1 = _rewrite_route[length - 1];
                                                if (n1 == null)
                                                {
                                                    n1 = new RewritePathNode() { chindren = new Dictionary<string, RewritePathNode>() };
                                                    _rewrite_route[length - 1] = n1;
                                                }
                                                List<Tuple<string, int>> keys = new List<Tuple<string, int>>();
                                                for (int i = 0; i < length; i++)
                                                {
                                                    pathnode = subpaths[i];
                                                    if (pathnode[0] == '{' && pathnode[pathnode.Length - 1] == '}')
                                                    {
                                                        isgoing = false;
                                                        keys.Add(new Tuple<string, int>(pathnode.Substring(1, pathnode.Length - 2), i));
                                                    }
                                                    else
                                                    {
                                                        if (isgoing)
                                                        {
                                                            if (!n1.chindren.TryGetValue(pathnode, out n2))
                                                            {
                                                                n2 = new RewritePathNode() { chindren = new Dictionary<string, RewritePathNode>() };
                                                                n1.chindren.Add(pathnode, n2);
                                                            }
                                                            n1 = n2;
                                                        }
                                                    }
                                                }
                                                if (n1.func == null)
                                                {
                                                    if (rewriteattr.Headers != null) headers = rewriteattr.Headers;
                                                    n1.func = HttpHelper.GetOwinRewriteTask(type, paramtype, m.ReturnType, m, rewriteattr.MaxLength, headers, keys);
                                                }
                                                else
                                                {
                                                    Debug.Write(string.Format("Rewrite路径重复注册. path:{0};param:{1};func:{2}", rewriteattr.Path, paramtype.Name, m.Name));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            var builder = new AppBuilder();
            Configuration(builder);
            _owinApp = builder.Build();
        }