Skip to content

Commit d50d32f

Browse files
committed
优化了文档中的类型名称,修复了认证接口不显示需要认证
1 parent 8ad4352 commit d50d32f

3 files changed

Lines changed: 41 additions & 30 deletions

File tree

SimApi.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="10.0.1" />
2424
<PackageReference Include="Minio" Version="7.0.0" />
2525
<PackageReference Include="MQTTnet" Version="5.0.1.1416"/>
26-
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="10.0.1" />
27-
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.0.1" />
26+
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="10.1.0" />
27+
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.1.0" />
2828
</ItemGroup>
2929
<ProjectExtensions>
3030
<MonoDevelop>

SimApiExtensions.cs

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,42 @@ public static IServiceCollection AddSimApi(this IServiceCollection builder,
124124
});
125125
}
126126

127-
x.CustomSchemaIds(type => type.FullName?.Replace("+", "."));
127+
x.CustomSchemaIds(type =>
128+
{
129+
string GetSimpleTypeName(Type t)
130+
{
131+
if (t.IsArray)
132+
{
133+
var elementType = t.GetElementType();
134+
return $"{GetSimpleTypeName(elementType)}[]";
135+
}
136+
137+
if (t.IsPrimitive || t == typeof(string) || t == typeof(DateTime) || t == typeof(Guid))
138+
{
139+
return t.Name switch
140+
{
141+
"String" => "string",
142+
"Int32" => "int",
143+
"Int64" => "long",
144+
"Boolean" => "boolean",
145+
"DateTime" => "DateTime",
146+
"Guid" => "Guid",
147+
_ => t.Name
148+
};
149+
}
150+
151+
return t.Name;
152+
}
153+
154+
if (!type.IsGenericType) return GetSimpleTypeName(type);
155+
var baseName = type.GetGenericTypeDefinition().Name.Split('`')[0];
156+
var genericArgs = type.GetGenericArguments()
157+
.Select(GetSimpleTypeName)
158+
.ToArray();
159+
return genericArgs.Length > 0
160+
? $"{baseName}<{string.Join(",", genericArgs)}>"
161+
: baseName;
162+
});
128163
x.OperationFilter<SimApiResponseOperationFilter>();
129164
x.OperationFilter<SimApiSignOperationFilter>();
130165
x.OperationFilter<AesBodyOperationFilter>();
@@ -159,19 +194,13 @@ public static IServiceCollection AddSimApi(this IServiceCollection builder,
159194
switch (auth)
160195
{
161196
case "SimApiAuth":
162-
x.AddSecurityDefinition("HeaderToken",
197+
x.AddSecurityDefinition("SimApiAuth",
163198
new OpenApiSecurityScheme
164199
{
165200
Name = "Token",
166201
In = ParameterLocation.Header,
167202
Type = SecuritySchemeType.ApiKey
168203
});
169-
x.AddSecurityRequirement(docs => new OpenApiSecurityRequirement
170-
{
171-
{
172-
new OpenApiSecuritySchemeReference("HeaderToken"), new List<string>()
173-
}
174-
});
175204
break;
176205
case "ClientCredentials":
177206
oauthFlows.ClientCredentials = new OpenApiOAuthFlow
@@ -220,12 +249,6 @@ public static IServiceCollection AddSimApi(this IServiceCollection builder,
220249
Description = docOptions.ApiAuth.Description,
221250
In = ParameterLocation.Header
222251
});
223-
x.AddSecurityRequirement(docs => new OpenApiSecurityRequirement
224-
{
225-
{
226-
new OpenApiSecuritySchemeReference("oauth2"), new List<string>()
227-
}
228-
});
229252
}
230253
});
231254
}

SwaggerFilters/SimApiAuthOperationFilter.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,10 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context)
1919
// 控制器上有 [SimApiAuth](继承到所有方法)
2020
context.MethodInfo.DeclaringType?.GetCustomAttributes<SimApiAuthAttribute>(true).Any() == true;
2121
if (!requiresAuth) return;
22-
23-
// 关键修复:正确构造 OpenApiSecuritySchemeReference(匹配键类型要求)
24-
var securitySchemeRef = new OpenApiSecuritySchemeReference(
25-
referenceId: "SimApiAuth", // 必须与 AddSecurityDefinition 的 ID 一致
26-
hostDocument: null,
27-
externalResource: null
28-
);
29-
30-
// 给 Security 赋值(确保键类型是 OpenApiSecuritySchemeReference)
3122
operation.Security ??= new List<OpenApiSecurityRequirement>();
32-
operation.Security.Add(new OpenApiSecurityRequirement
23+
operation.Security.Add(new OpenApiSecurityRequirement()
3324
{
34-
{
35-
securitySchemeRef,
36-
[]
37-
}
25+
{ new OpenApiSecuritySchemeReference("SimApiAuth", context.Document), [] }
3826
});
3927
}
4028
}

0 commit comments

Comments
 (0)