/// <summary>配置远程服务 /// </summary> /// <param name="controller">控制器</param> /// <param name="configuration">常规控制器设置</param> protected virtual void ConfigureRemoteService(ControllerModel controller, ConventionalControllerSetting configuration) { ConfigureApiExplorer(controller); ConfigureControllerSelector(controller, configuration); ConfigureParameters(controller); }
/// <summary>格式化UrlAction名称 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="httpMethod">Http方法</param> /// <param name="configuration">常规控制器设置</param> /// <returns></returns> protected virtual string NormalizeUrlActionName(string rootPath, string controllerName, ActionModel action, string httpMethod, ConventionalControllerSetting configuration) { var actionNameInUrl = HttpMethodUtil .RemoveHttpMethodPrefix(action.ActionName, httpMethod) .RemovePostFix("Async"); if (configuration?.UrlActionNameNormalizer == null) { return(actionNameInUrl); } return(configuration.UrlActionNameNormalizer( new UrlActionNameNormalizerContext( rootPath, controllerName, action, actionNameInUrl, httpMethod ) )); }
/// <summary>格式化控制器名 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="httpMethod">Http方法</param> /// <param name="configuration">常规控制器设置</param> /// <returns></returns> protected virtual string NormalizeUrlControllerName(string rootPath, string controllerName, ActionModel action, string httpMethod, ConventionalControllerSetting configuration) { if (configuration?.UrlControllerNameNormalizer == null) { return(controllerName); } return(configuration.UrlControllerNameNormalizer( new UrlControllerNameNormalizerContext( rootPath, controllerName ) )); }
/// <summary>创建服务属性路由模型 /// </summary> /// <param name="rootPath">根目录</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="httpMethod">Http方法</param> /// <param name="configuration">常规控制器设置</param> /// <returns></returns> protected virtual AttributeRouteModel CreateServiceAttributeRouteModel(string rootPath, string controllerName, ActionModel action, string httpMethod, ConventionalControllerSetting configuration) { return(new AttributeRouteModel( new RouteAttribute( CalculateRouteTemplate(rootPath, controllerName, action, httpMethod, configuration) ) )); }
/// <summary>计算路由模板 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="httpMethod">Http方法</param> /// <param name="configuration">常规控制器设置</param> /// <returns></returns> protected virtual string CalculateRouteTemplate(string rootPath, string controllerName, ActionModel action, string httpMethod, ConventionalControllerSetting configuration) { var controllerNameInUrl = NormalizeUrlControllerName(rootPath, controllerName, action, httpMethod, configuration); var url = $"api/{rootPath}/{controllerNameInUrl.ToCamelCase()}"; //Add {id} path if needed if (action.Parameters.Any(p => p.ParameterName == "id")) { url += "/{id}"; } //Add action name if needed var actionNameInUrl = NormalizeUrlActionName(rootPath, controllerName, action, httpMethod, configuration); if (!actionNameInUrl.IsNullOrEmpty()) { url += $"/{actionNameInUrl.ToCamelCase()}"; //Add secondary Id var secondaryIds = action.Parameters.Where(p => p.ParameterName.EndsWith("Id", StringComparison.Ordinal)).ToList(); if (secondaryIds.Count == 1) { url += $"/{{{secondaryIds[0].ParameterName}}}"; } } return(url); }
/// <summary>正式路由选择 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="configuration">常规控制器设置</param> protected virtual void NormalizeSelectorRoutes(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting configuration) { foreach (var selector in action.Selectors) { var httpMethod = selector.ActionConstraints.OfType <HttpMethodActionConstraint>().FirstOrDefault()?.HttpMethods?.FirstOrDefault(); if (selector.AttributeRouteModel == null) { selector.AttributeRouteModel = CreateServiceAttributeRouteModel(rootPath, controllerName, action, httpMethod, configuration); } } }
/// <summary>选择Http方法 /// </summary> /// <param name="action">Action</param> /// <param name="configuration">常规控制器设置</param> /// <returns></returns> protected virtual string SelectHttpMethod(ActionModel action, ConventionalControllerSetting configuration) { return(HttpMethodUtil.GetConventionalVerbForMethodName(action.ActionName)); }
/// <summary>添加服务选择器 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制器名</param> /// <param name="action">Action</param> /// <param name="configuration">常规控制器设置</param> protected virtual void AddServiceSelector(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting configuration) { //根据方法名称生成Http请求的路径 var httpMethod = SelectHttpMethod(action, configuration); var routeModel = CreateServiceAttributeRouteModel(rootPath, controllerName, action, httpMethod, configuration); var serviceSelectorModel = new SelectorModel { AttributeRouteModel = routeModel, ActionConstraints = { new HttpMethodActionConstraint(new[] { httpMethod }) }, // EndpointMetadata = { new RouteAttribute(routeModel.Template) } }; action.Selectors.Add(serviceSelectorModel); }
/// <summary>配置Action选择器 /// </summary> /// <param name="rootPath">根路径</param> /// <param name="controllerName">控制气门</param> /// <param name="action">Action</param> /// <param name="configuration">常规控制器设置</param> protected virtual void ConfigureActionSelector(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting configuration) { RemoveEmptySelectors(action.Selectors); if (!action.Selectors.Any()) { AddServiceSelector(rootPath, controllerName, action, configuration); } else { NormalizeSelectorRoutes(rootPath, controllerName, action, configuration); } }
/// <summary>配置控制器选择器 /// </summary> /// <param name="controller">控制器</param> /// <param name="configuration">常规控制器设置</param> protected virtual void ConfigureControllerSelector(ControllerModel controller, ConventionalControllerSetting configuration) { RemoveEmptySelectors(controller.Selectors); if (controller.Selectors.Any(selector => selector.AttributeRouteModel != null)) { return; } var rootPath = GetRootPathOrDefault(controller.ControllerType.AsType()); foreach (var action in controller.Actions) { ConfigureActionSelector(rootPath, controller.ControllerName, action, configuration); } }