public IRoutingManager Add <T>(string routeName, string url) where T : IWebHandler { var fullName = typeof(T).FullName; var handler = GlobalApplicationObject.Current.ApplicationContext.WebHandlerList.FirstOrDefault(p => p.FullName == fullName); if (handler == null) { Log.LogFormat(LoggerLevels.Error, "Handler不存在。 routeName:{0} url:{1} WebHandler:{2} by:{3}", routeName, url, fullName, StackHelper.GetCallingType().FullName); } else if (handler != null && !RouteWebHandlerInfoList.Any(p => p.routeName == routeName)) { var routeWebHandlerInfo = new RouteWebHandlerInfo() { routeName = routeName, routeUrl = url, WebHandlerInfo = handler }; RouteWebHandlerInfoList.Add(routeWebHandlerInfo); Log.LogFormat(LoggerLevels.Info, "AddRoute routeName:{0} url:{1} WebHandler:{2} by:{3}", routeName, url, fullName, StackHelper.GetCallingType().FullName); } else { Log.LogFormat(LoggerLevels.Warn, "Route已存在。 routeName:{0} url:{1} WebHandler:{2} by:{3}", routeName, url, fullName, StackHelper.GetCallingType().FullName); } return(this); }
public void ProcessRequest(HttpContext context) { if (RouteWebHandlerInfo.IsNotNull()) { switch (HandlerType) { case WebHandlerTypes.JSONHandler: { ProcessHander(context, RouteWebHandlerInfo.WebHandlerInfo); } break; case WebHandlerTypes.ResourceHandler: { var res = new ResourceManager(context); res.SendResourceContent(); break; } case WebHandlerTypes.WebAPIHandler: { ProcessHander(context, RouteWebHandlerInfo.WebHandlerInfo); break; } default: break; } return; } ////程序集名称 //var assemblyName = WebContext.RouteValues["assemblyName"].ToString(); ////对应Name //var handlerName = WebContext.RouteValues["handlerName"].ToString(); switch (HandlerType) { case WebHandlerTypes.JSONHandler: #region 处理JSON { var mainUrls = context.Request.Url.AbsolutePath.ToLower().Trim('/').Split('/'); //程序集名称 var assemblyName = mainUrls[1]; //对应Name var handlerName = mainUrls[2]; //根据程序集名称以及Name匹配Handler var jsonHandler = GlobalApplicationObject.Current.ApplicationContext.WebHandlerList .FirstOrDefault(p => p.WebHandlerType == WebHandlerTypes.JSONHandler && p.AssemblyName.Equals(assemblyName, StringComparison.CurrentCultureIgnoreCase) && p.Name.Equals(handlerName, StringComparison.CurrentCultureIgnoreCase)); if (jsonHandler != null) { ProcessHander(context, jsonHandler); } } break; #endregion case WebHandlerTypes.ResourceHandler: { var res = new ResourceManager(context); res.SendResourceContent(); } break; case WebHandlerTypes.WebAPIHandler: { var mainUrls = context.Request.Url.AbsolutePath.ToLower().Trim('/'); //根据程序集名称以及Name匹配Handler var handlers = GlobalApplicationObject.Current.ApplicationContext.WebHandlerList .Where(p => p.WebHandlerType == WebHandlerTypes.WebAPIHandler && mainUrls.StartsWith("api/" + p.WebAPIName)); var count = handlers.Count(); if (count == 1) { ProcessHander(context, handlers.First()); } else if (count > 1) { mainUrls = mainUrls.RightOf("api/"); var urlParams = mainUrls.Split('/'); //TODO:应该改为按照位置0开始的相邻的字符串的相似度比较 //比较相似度,取相似度最高的 var webAPIHandler = handlers.Select(p => new { webApi = p, SimilarityCount = p.WebAPIName.Split('/').Intersect(urlParams).Count() }) .OrderByDescending(p => p.SimilarityCount) .First().webApi; ProcessHander(context, webAPIHandler); } break; } default: break; } }