diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index cffb5c6f24..49eb9ebd43 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -1,6 +1,8 @@ using System; using System.Linq; using System.Reflection; +using System.Text; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Logging; @@ -57,16 +59,17 @@ namespace Volo.Abp.AspNetCore.Mvc var method = apiDescription.ActionDescriptor.GetMethodInfo(); - if (controllerModel.Actions.ContainsKey(method.Name)) + var uniqueMethodName = GetUniqueActionName(method); + if (controllerModel.Actions.ContainsKey(uniqueMethodName)) { - Logger.LogWarning($"Controller '{controllerModel.Name}' contains more than one action with name '{method.Name}' for module '{moduleModel.Name}'. Ignored: " + apiDescription.ActionDescriptor.GetMethodInfo()); + Logger.LogWarning($"Controller '{controllerModel.Name}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.Name}'. Ignored: " + method); return; } var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType); var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel( - method.Name, + uniqueMethodName, returnValue, apiDescription.RelativePath, apiDescription.HttpMethod @@ -81,6 +84,29 @@ namespace Volo.Abp.AspNetCore.Mvc ?? apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerName; } + private static string GetUniqueActionName(MethodInfo method) + { + var methodNameBuilder = new StringBuilder(method.Name); + + var parameters = method.GetParameters(); + if (parameters.Any()) + { + methodNameBuilder.Append("By"); + + for (var i = 0; i < parameters.Length; i++) + { + if (i > 0) + { + methodNameBuilder.Append("And"); + } + + methodNameBuilder.Append(parameters[i].Name.ToPascalCase()); + } + } + + return methodNameBuilder.ToString(); + } + private void AddParameterDescriptionsToModel(ActionApiDescriptionModel actionModel, MethodInfo method, ApiDescription apiDescription) { if (!apiDescription.ParameterDescriptions.Any()) @@ -143,6 +169,12 @@ namespace Volo.Abp.AspNetCore.Mvc } } + var areaAttr = controllerType.GetCustomAttributes().OfType().FirstOrDefault(); + if (areaAttr != null) + { + return areaAttr.RouteValue; + } + return AbpControllerAssemblySetting.DefaultServiceModuleName; } } diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs index 7c1a913ffd..f2bb05ba74 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs @@ -3,6 +3,7 @@ using Volo.Abp.Http.Modeling; namespace Volo.Abp.AspNetCore.Mvc.Controllers { + [Area("abp")] public class ApiDefinitionController : AbpController { private readonly IApiDescriptionModelProvider _modelProvider; @@ -16,8 +17,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Controllers [Route("api/abp/api-description")] public ApplicationApiDescriptionModel Get() { - //TODO: It can not create methods if there are overloads of same action in a controller! - return _modelProvider.CreateModel(); } }