更改.NET Web API 2中通过Swashbuckle生成的Swagger JSON的参数名称

cod*_*ove 8 c# json asp.net-web-api swagger swashbuckle

目标:我正在设计一个REST API,允许用户在查询字符串上传递HTTP GET请求的参数.就像是

http://fake.api.com/search?api-key=1235&term=car&rows=10
Run Code Online (Sandbox Code Playgroud)

实现:在服务器端,我有一个模型绑定器,它接受这3个参数 - api-key,term和rows,并将它们转换为C#对象,这样我的控制器操作方法就不必解析查询字符串了.所以控制器动作方法签名看起来像

public IHttpActionResult Get(RequestObject request)
Run Code Online (Sandbox Code Playgroud)

问题:我在Swagger中遇到的是它生成文档和测试工具时,它将输入参数列为request.api-key,request.term和request.rows.这是因为从服务器获取的JSON是将对象名称添加到这些值的前缀.因此,当您尝试使用Swagger UI执行HTTP GET请求时,它会构建类似的URL

http://fake.api.com/search?request.api-key=1235&request.term=car&request.rows=10
Run Code Online (Sandbox Code Playgroud)

这是对服务器的错误请求.现在我可以轻松地使我的模型绑定器变得更聪明,只是忽略"请求".部分,但这似乎是一个解决这个问题的落后方式.

问题:如何在服务器端自定义由Swashbuckle - > Swagger生成的JSON,以便此特定对象的参数名称不以对象名称为前缀?我确实调查了Swashbuckle可扩展性API公开的ISchemaFilter和IDocumentFilter,但我没有看到一个干净的方法来做到这一点.可能是有可能的,但在这种情况下,一个例子会有所帮助.

cod*_*ove 5

找到了一个解决方案,事实证明这是我忽略的一件事-IOperationFilter。有关详细信息,请参见https://github.com/domaindrivendev/Swashbuckle/issues/128

更新资料

这是注释中提到的解决方案的代码

public class IgnorePrefixParamsNameBeforeDot : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters != null)
        {
            foreach (Parameter param in operation.parameters.Where(p => p.name.Contains('.')))
            {
                param.name = param.name.SplitWithoutEmpty('.').Last();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)