Kzr*_*tof 9 c# swagger azure-functions .net-5 system.text.json
我正在探索.net5在新的隔离模式下运行的功能应用程序。我有 HTTP 触发的函数,我想通过 OpenAPI / Swagger 进行宣传。
为此,我使用预览版 (0.7.2)Microsoft.Azure.WebJobs.Extensions.OpenApi中的包将 OpenAPI 功能添加到我的 Function App。
我试图让其enums显示string在 OpenAPI 页面中,但我无法让它正常工作。
这是文件中的设置Program.cs:
public static class Program
{
private static Task Main(string[] args)
{
IHost host = new HostBuilder()
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.AddCommandLine(args);
})
.ConfigureFunctionsWorkerDefaults(builder =>
{
builder.Services.Configure<JsonSerializerOptions>(options =>
{
options.Converters.Add(new JsonStringEnumConverter());
options.PropertyNameCaseInsensitive = true;
});
})
.ConfigureServices(services =>
{
// Registers any services.
})
.Build();
return host.RunAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
这是枚举:
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ApprovalContract
{
[EnumMember(Value = "Approved")]
Approved = 1,
[EnumMember(Value = "Rejected")]
Rejected = 2
}
Run Code Online (Sandbox Code Playgroud)
以及使用它的类之一:
public sealed class DeletionResponseContract
{
[JsonPropertyName("approval")]
public ApprovalContract Approval { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我到处都替换了对的任何Newtonsoft.Json引用System.Text.Json。
以下是 Swagger 页面中的输出:
问题
如何使用 HTTP 触发的 Azure Functions 序列enum化为string而不是int在 Swagger 页面中运行.net5?
更新
我看到 的JsonStringEnumConverter构造函数给出了允许整数值的指示:
public JsonStringEnumConverter(JsonNamingPolicy? namingPolicy = null, bool allowIntegerValues = true)
{
this._namingPolicy = namingPolicy;
this._converterOptions = allowIntegerValues ? EnumConverterOptions.AllowStrings | EnumConverterOptions.AllowNumbers : EnumConverterOptions.AllowStrings;
}
Run Code Online (Sandbox Code Playgroud)
我像这样修改了我的配置,但没有成功:
builder.Services.Configure<JsonSerializerOptions>(options =>
{
options.Converters.Add(new JsonStringEnumConverter(allowIntegerValues: false));
options.PropertyNameCaseInsensitive = true;
});
Run Code Online (Sandbox Code Playgroud)
您必须实现 ISchemaFilter 并将其设置在 AddSwaggerGen 上。它将为您的枚举项目生成更好的描述。
builder.Services.AddSwaggerGen(c =>
{
c.SchemaFilter<EnumSchemaFilter>();
});
//your implementation
public class EnumSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema model, SchemaFilterContext context)
{
if (context.Type.IsEnum)
{
model.Enum.Clear();
Enum.GetNames(context.Type)
.ToList()
.ForEach(name => model.Enum.Add(new OpenApiString($"{Convert.ToInt64(Enum.Parse(context.Type, name))} - {name}")));
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3467 次 |
| 最近记录: |