Пример #1
0
 /// <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);
 }
Пример #2
0
        /// <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
                           )
                       ));
        }
Пример #3
0
        /// <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
                           )
                       ));
        }
Пример #4
0
 /// <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)
                    )
                ));
 }
Пример #5
0
        /// <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);
        }
Пример #6
0
 /// <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);
         }
     }
 }
Пример #7
0
 /// <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));
 }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
            }
        }
Пример #10
0
        /// <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);
            }
        }