我想清理我的 webapi 的 swagger ui 中的模型名称。
问题是,当我在端点上定义响应类型时,并且该类型是通用的,它的命名方式是,如果使用像 NSwag 这样的 swagger-gen 工具,模型会得到最糟糕的名称, (因为它们基于 swagger,所以我想定义模型的命名方式)。
这是响应属性:
[ProducesResponseType(typeof(BulkUpsertResponse<AccountingCode>), StatusCodes.Status200OK)]
这是最终的名称:
Company.IntegrationApi.Api.Models.Responses.BulkUpsertResponse1[[Company.IntegrationApi.Api.Models.AccountingParameters.AccountingCode, Company.IntegrationApi.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
NSwag 的目标是:
BulkUpsertResponse_1OfOfAccountingCodeAndApiAnd_0AndCulture_neutralAndPublicKeyToken_null
我想要的名字是:
BulkUpsertResponse<AccountingCode>
我试图找到一个属性或标签来定义名称,但将泛型变成“硬类型”是不可行的,因为它有数百种用途。
如何准确指定名称,或者可以使用哪些解决方法来解决我的问题?
添加 Swashbuckle.Swagger NuGet 包。 然后在你的 init 方法中使用
CustomSchemaIds(i => i.FriendlyId(true));
参见下面的示例:D
using Swashbuckle.Swagger;
///then in configure services..
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1",
Title = "Your API",
Description = "Interfaces available for API",
});
c.CustomSchemaIds(x => x.FullName);
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
c.CustomSchemaIds(i => i.FriendlyId(true));
});
这对我有用,因为当前的 Swagger 中似乎不再存在 Friendship 方法:
c.CustomSchemaIds(i => i.FriendlyId(true));
(与daveBM的答案相同)
然后这个:
public static string FriendlyId(this Type type, bool fullyQualified = false)
{
var typeName = fullyQualified
? type.FullNameSansTypeArguments().Replace("+", ".")
: type.Name;
if (!type.GetTypeInfo().IsGenericType)
{
return typeName;
}
var genericArgumentIds = type.GetGenericArguments()
.Select(t => t.FriendlyId(fullyQualified))
.ToArray();
return new StringBuilder(typeName)
.Replace(string.Format("`{0}", genericArgumentIds.Count()), string.Empty)
.Append(string.Format("[{0}]", string.Join(",", genericArgumentIds).TrimEnd(',')))
.ToString();
}