public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { var controllerAttribute = controller.Attributes.FirstOrDefault(o => o is ApiAreaRemarkAttribute); string areaName = (controllerAttribute == null) ? string.Empty : (((ApiAreaRemarkAttribute)controllerAttribute).Area); if (areaName.IsNotNullOrEmpty() && !areas.Contains(areaName)) { areas.Add(areaName); } foreach (var action in controller.Actions) { var actionAttribute = action.Attributes.FirstOrDefault(o => o is ApiActionRemarkAttribute); if (actionAttribute == null) { continue; } var attribute = actionAttribute as ApiActionRemarkAttribute; if (attribute.UniqueId.IsNullOrEmpty()) { continue; } var routeName = string.Concat(areaName.IsNullOrEmpty() ? "" : (areaName + "/"), attribute.UniqueId); string actionName = action.ActionName; if (!count && routeDict.ContainsKey(routeName)) { throw new KeyExistedException(routeName, string.Format("在api控件器中找到相同的标识,当前控制器和方法为{0}-{1},已经存在的控制器和方法为{2}-{3}", controller.ControllerType.FullName, actionName, routeDict[routeName].ControllerName, routeDict[routeName].ActionMethod.Name)); } if (!count && action.Selectors.Where(o => o.AttributeRouteModel != null && o.AttributeRouteModel.Template.IsEquals(routeName)).Any()) { throw new KeyExistedException(routeName, string.Format("已经注册过{0}的路由,请检查当前系统路由配置", routeName)); } routeDict[routeName] = new ActionResultMetadata() { ControllerName = controller.ControllerName, ControllerType = controller.ControllerType, ActionMethod = action.ActionMethod, AreaName = areaName }; var httpMethod = httpMethodProvider.FirstOrDefault(o => o.Name.IndexOf(attribute.HttpMethod, StringComparison.OrdinalIgnoreCase) >= 0); if (httpMethod == null) { action.Selectors.Add(new SelectorModel() { AttributeRouteModel = new AttributeRouteModel(new HttpGetAttribute(routeName)) }); continue; } action.Selectors.Add(new SelectorModel() { AttributeRouteModel = new AttributeRouteModel(Activator.CreateInstance(httpMethod, new[] { routeName }) as HttpMethodAttribute) }); } } count = true; }
public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { var apiAreaRemarkAttribute = controller.Attributes.FirstOrDefault(o => o is ApiAreaRemarkAttribute) as ApiAreaRemarkAttribute; var routeAttribute = controller.Attributes.FirstOrDefault(o => o is Microsoft.AspNetCore.Mvc.RouteAttribute) as RouteAttribute; string areaName = string.Empty, routeAreaName = string.Empty; if (routeAttribute != null && routeAttribute.Template.IsNotNullOrEmpty()) { var splits = routeAttribute.Template.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (splits.Length > 0 && splits[0].IsEquals("api", StringComparison.CurrentCultureIgnoreCase)) { for (var i = 1; i < splits.Length; i++) { if (i == splits.Length - 1) { areaName = string.Concat(areaName, splits[i]); } else { areaName = string.Concat(areaName, splits[i], "/"); } } routeAreaName = areaName; } } areaName = areaName.IsNullOrEmpty() ? string.Concat(areaName, apiAreaRemarkAttribute?.Area) : string.Concat(areaName, "/", apiAreaRemarkAttribute?.Area); if (areaName.IsNotNullOrEmpty() && !areas.Contains(areaName)) { areas.Add(areaName); } foreach (var action in controller.Actions) { var actionAttribute = action.Attributes.FirstOrDefault(o => o is ApiActionRemarkAttribute); if (actionAttribute == null) { continue; } var attribute = actionAttribute as ApiActionRemarkAttribute; if (attribute.UniqueId.IsNullOrEmpty()) { continue; } var routeName = string.Concat(areaName.IsNullOrEmpty() ? "" : (areaName + "/"), attribute.UniqueId); var template = routeAreaName.IsNullOrEmpty() ? routeName : routeName.Sub(routeAreaName.Length + 1); string actionName = action.ActionName; if (routeDict.ContainsKey(routeName)) { throw new KeyExistedException(routeName, string.Format("在api控件器中找到相同的标识,当前控制器和方法为{0}-{1},已经存在的控制器和方法为{2}-{3}", controller.ControllerType.FullName, actionName, routeDict[routeName].ControllerName, routeDict[routeName].ActionMethod.Name)); } if (action.Selectors.Where(o => o.AttributeRouteModel != null && o.AttributeRouteModel.Template.IsEquals(routeName)).Any()) { throw new KeyExistedException(routeName, string.Format("已经注册过{0}的路由,请检查当前系统路由配置", routeName)); } routeDict[routeName] = new ActionResultMetadata() { ControllerName = controller.ControllerName, ControllerType = controller.ControllerType, ActionMethod = action.ActionMethod, AreaName = apiAreaRemarkAttribute?.Area }; var httpMethod = httpMethodProvider.FirstOrDefault(o => o.Name.IndexOf(attribute.HttpMethod, StringComparison.OrdinalIgnoreCase) >= 0); if (httpMethod == null) { action.Selectors.Add(new SelectorModel() { AttributeRouteModel = new AttributeRouteModel(new HttpGetAttribute(template)) }); continue; } action.Selectors.Add(new SelectorModel() { AttributeRouteModel = new AttributeRouteModel(Activator.CreateInstance(httpMethod, new[] { template }) as HttpMethodAttribute) }); } } }