diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs index 5e86c04189..2b61037487 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; @@ -8,7 +9,7 @@ namespace Volo.Abp.Swashbuckle; public class AbpSwashbuckleDocumentFilter : IDocumentFilter { - protected string[] ActionUrlPrefixes = new[] {"Volo."}; + protected virtual string[] ActionUrlPrefixes { get; set; } = new[] { "Volo." }; public virtual void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { @@ -17,7 +18,7 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter .Where(actionDescriptor => !string.IsNullOrEmpty(actionDescriptor.DisplayName) && ActionUrlPrefixes.Any(actionUrlPrefix => !actionDescriptor.DisplayName.Contains(actionUrlPrefix))) .DistinctBy(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template) - .Select(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template?.EnsureStartsWith('/').Replace("?", "")) + .Select(RemoveRouteParameterConstraints) .Where(actionUrl => !string.IsNullOrEmpty(actionUrl)) .ToList(); @@ -25,4 +26,23 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter .Paths .RemoveAll(path => !actionUrls.Contains(path.Key)); } + + protected virtual string RemoveRouteParameterConstraints(ActionDescriptor actionDescriptor) + { + var route = actionDescriptor.AttributeRouteInfo?.Template?.EnsureStartsWith('/').Replace("?", ""); + if (string.IsNullOrWhiteSpace(route)) + { + return route; + } + + var startIndex = route.IndexOf(":", StringComparison.Ordinal); + var endIndex = route.IndexOf("}", StringComparison.Ordinal); + + if (startIndex == -1 || endIndex == -1) + { + return route; + } + + return route.Remove(startIndex, (endIndex - startIndex)); + } } \ No newline at end of file