使用Microsoft.Azure.WebJobs.Extensions.OpenApi时,如何让枚举返回名称?(C#)
用Microsoft.Azure.WebJobs.Extensions.OpenApi为枚举生成x-enumNames
核心思路
Microsoft.Azure.WebJobs.Extensions.OpenApi 原生支持通过自定义 IOpenApiSchemaFilter 扩展Schema生成逻辑,和Swashbuckle的ISchemaFilter作用一致,且无需额外配置HTTP函数,直接集成在OpenApi扩展体系内。
实现步骤
- 编写自定义Schema过滤器
实现IOpenApiSchemaFilter接口,在Apply方法中为枚举类型注入x-enumNames扩展属性:
using Microsoft.OpenApi.Models; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions; using System; using System.Collections.Generic; using System.Linq; public class EnumNamesSchemaFilter : IOpenApiSchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type.IsEnum) { var enumNames = Enum.GetNames(context.Type).ToList(); schema.Extensions.Add("x-enumNames", new Microsoft.OpenApi.Any.OpenApiStringArray(enumNames)); } } }
- 注册过滤器到OpenApi配置
在Azure Functions的启动类(无则新建)中,通过OpenApiConfigurationOptions注册自定义过滤器:
using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Hosting; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Configurations; using Microsoft.Extensions.DependencyInjection; [assembly: WebJobsStartup(typeof(OpenApiStartup))] public class OpenApiStartup : IWebJobsStartup { public void Configure(IWebJobsBuilder builder) { builder.Services.Configure<OpenApiConfigurationOptions>(options => { options.SchemaFilters.Add(new EnumNamesSchemaFilter()); }); } }
- 验证生成结果
启动Azure Functions后,访问默认OpenApi文档端点/api/swagger.json,查看枚举类型的Schema节点,会看到已自动添加x-enumNames属性,示例如下:
"OrderStatus": { "type": "string", "enum": [ "Pending", "Shipped", "Delivered" ], "x-enumNames": [ "Pending", "Shipped", "Delivered" ] }
隔离进程模型适配
如果使用隔离进程模型的Azure Functions,需在Program.cs中配置:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { services.Configure<OpenApiConfigurationOptions>(options => { options.SchemaFilters.Add(new EnumNamesSchemaFilter()); }); }) .Build();
内容的提问来源于stack exchange,提问作者Paul Johnson
相关产品推荐
相关产品推荐

