使用自定义模型绑定程序时,Swashbuckle请求参数不起作用

问题描述

我有一个ASP.NET Core 3.1 API端点,其配置如下:

[HttpGet("api/controller/action/{id}")]
public async Task<IActionResult> GetSingle([FromRoute] GetSingleRequest request) {...}

DTO具有单个Guid属性:

public class GetSingleRequest
{
  public Guid Id { get; set; }
}

我已经配置了一个自定义模型绑定程序,以便在使用简短的Guid实现时​​将Guid属性绑定到字符串值。使用Postman进行测试时,一切正常。

但是,当使用Swagger时,它没有传递输入的route参数,而是传递了参数模板,例如。

GET /api/controller/action/{id}     // Literally constructs the URI with {id}
GET /api/controller/action/abcd1234 // Not the value as entered

我尝试如下使用MapTypeISchemaFilter

// startup.cs
c.MapType<Guid>(() => new OpenApiSchema {Type = "string",Format = null});
// startup.cs
c.SchemaFilter<GuidSchemaFilter>();

// GuidSchemaFilter.cs
internal class GuidSchemaFilter : ISchemaFilter
  {
    public void Apply(OpenApiSchema schema,SchemaFilterContext context)
    {
      if (context.Type != typeof(Guid))
      {
        return;
      }

      schema.Type = "string";
      schema.Format = null;
    }
  }

这两种方法都无法改变这种奇怪的行为。

配置了自定义模型绑定程序后,如何配置Swagger将字符串而不是Guid作为URI的一部分传递?

解决方法

如何配置Swagger以传递字符串而不是Guid作为一部分 配置了自定义模型绑定程序时,URI的地址是什么?

实际上,c.MapType<Guid>(() => new OpenApiSchema {Type = "string",Format = null});这句话足以解决问题。

问题的关键在于您的路由中的参数为Camel Case id ,而GetSingleRequest中的字段为Pascal Case Id 。

作为注释,您可以添加c.DescribeAllParametersInCamelCase();以使其忽略大小写问题。

  services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1",new OpenApiInfo { Title = "My API" });
                c.MapType<Guid>(() => new OpenApiSchema { Type = "string",Format = null });
                c.DescribeAllParametersInCamelCase();
            }); 

或者您将路由模板中的ID更改为ID

        [HttpGet("api/controller/action/{Id}")]
        public async Task<IActionResult> GetSingle([FromRoute] GetSingleRequest request) 
        {

            return Ok();
        }

这是测试结果:

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...