/// <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(); }
/// <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(); }