首页 > 解决方案 > SnakeCase 请求正文忽略格式

问题描述

我需要将我的 .NET 核心 API 配置为蛇形案例,所以在我的启动中我放了:

.AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() };
                })

并大摇大摆地做了两个过滤器:

public class SwaggerSnakeCaseParameterFilter : IParameterFilter
    {
        private readonly SnakeCaseNamingStrategy _namingStrategy = new SnakeCaseNamingStrategy();

        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            parameter.Name = _namingStrategy.GetPropertyName(parameter.Name, false);
        }
    }
public class SwaggerSnakeCaseDocumentFilter : IDocumentFilter
    {
        private readonly SnakeCaseNamingStrategy _namingStrategy = new SnakeCaseNamingStrategy();

        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            foreach (var path in swaggerDoc.Paths.ToArray())
            {
                var apiDescription = context.ApiDescriptions.First(ad => "/" + ad.RelativePath == path.Key);
                var newKey = path.Key;
                foreach (var parameterDescription in apiDescription.ParameterDescriptions.Where(pd =>
                    pd.Source == BindingSource.Path))
                {
                    newKey = newKey.Replace(
                        "{" + parameterDescription.Name + "}",
                        "{" + _namingStrategy.GetPropertyName(parameterDescription.Name, false) + "}");
                }

                swaggerDoc.Paths.Remove(path.Key);
                swaggerDoc.Paths.Add(newKey, path.Value);
            }
        }
    }

但是请求正文和响应正文仍然显示为CamelCaseon Swagger。我错过了什么?来自查询和路由的参数工作正常。

标签: .net.net-coreswaggerswashbuckle

解决方案


您使用的是哪个版本的 Swashbuckle?如果您使用的是版本 5,它将System.Text.Json用于序列化。由于您使用的是 Newtonsoft,它将忽略您为 Newtonsoft 序列化配置的任何内容。

System.Text.Json如果您愿意,您可以让 Swashbuckle 使用 Newtonsoft,而不是:

  • 添加对的引用Swashbuckle.AspNetCore.Newtonsoft
  • services.AddSwaggerGenNewtonsoftSupport()呼叫后添加Startup.cs呼叫AddSwaggerGen()

如果您有兴趣,Swashbuckle 自述文件包含有关此的更多信息


推荐阅读