生成的UI文档不使用Swashbuckle AspNetCore来表达JsonProperty值

时间:2018-05-25 15:47:36

标签: c# swagger swagger-ui asp.net-core-webapi swashbuckle

我创建了一个类,我想用它来发送排序和分页信息以应用于我的大型集合。我有一个.NET Core Web API服务,它将接收请求并将我的对象作为输入FromQuery。我希望遵守某些命名约定(即Microsoft Rest API Guidelines)作为参数名称,例如$orderby$top$skip等,并注释了类的属性使用JsonProperty

但是,在生成的swagger文档中,这些只是显示为属性名称本身,例如,在我的属性名为Take但请求参数应为$top的情况下,这是一个问题。我希望生成的文档匹配,以免对API的消费者造成任何混淆。我读到的所有内容似乎表明这应该有效,而且我很难理解为什么它不适合我。

这是我的课程,其中包含使用Newtonsoft.Json.JsonPropertyAttribute

的注释
[JsonObject]
public class QueryParams {

    [JsonProperty( "$orderBy" )]
    public string OrderBy { get; set; }

    [JsonProperty( "$skip" )]
    public int? Skip { get; set; }

    [JsonProperty( "$top" )]
    public int? Take { get; set; }

    [JsonProperty( "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [JsonProperty( "$count" )]
    public bool? IncludeCount { get; set; }
}

然后,例如,我的Web API操作方法看起来像这样

    [HttpGet( "type/{type}" )]
    public async Task<IActionResult> GetByType( 
        string type, 
        [FromQuery]QueryParams parameters ) 
    {
       /* ... */ 

    }

我尝试了几件事情,例如 Override Schema for Specific Types中提到的MapType,但是没有运气。欣赏任何人都可以提出的任何见解。

1 个答案:

答案 0 :(得分:3)

根据this GitHub issueJsonSerializer不用于绑定GET请求的类。您需要自定义模型绑定。

  

因此,当您使用类来表示查询参数时,不会涉及JsonSerializer。相反,MVC模型绑定用于将请求中的值直接分配给实例属性。

     

因此,如果您希望明确此行为所需的大小写,以及生成的描述,则还需要自定义模型绑定行为。我现在不是在我的笔记本电脑上,但是我认为你可以用“FromQuery”注释属性并设置绑定名称。

如果我理解GH问题中的讨论,以下内容应该有效:

public class QueryParams {

    [FromQuery( Name = "$orderBy" )]
    public string OrderBy { get; set; }

    [FromQuery( Name = "$skip" )]
    public int? Skip { get; set; }

    [FromQuery( Name = "$top" )]
    public int? Take { get; set; }

    [FromQuery( Name = "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [FromQuery( Name = "$count" )]
    public bool? IncludeCount { get; set; }
}