如何解决使用自定义模型绑定程序时,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
我尝试如下使用MapType
和ISchemaFilter
:
// 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();
}
这是测试结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。