IPagedList <t>的Swashbuckle响应错误

时间:2017-11-03 08:51:00

标签: asp.net-core-2.0 swashbuckle pagedlist jsonserializer

我有一个asp.net核心项目,使用swashbuckle来生成JS客户端。 要使用分页,我们使用X.PagedList nuget中的PagedList。 控制器实施:

[HttpGet]
[ProducesResponseType(typeof(IPagedList<Model>), 200)]
[ProducesResponseType(typeof(void), 500)]
public async Task<IActionResult> Get([FromQuery]query)
{
    var response = await this.mediator.Send(query);

    return Ok(response.Results); // results is IPagedList<Model>
}

JSON中的结果如下所示:

{
    "count": 10,
    "pageCount": 2,
    "totalItemCount": 15,
    "pageNumber": 1,
    "pageSize": 10,
    "hasPreviousPage": false,
    "hasNextPage": true,
    "isFirstPage": true,
    "isLastPage": false,
    "firstItemOnPage": 1,
    "lastItemOnPage": 10,
    "items": [
        {
            "guid": "dafa9d3b-9ee2-4cbc-b7d7-902b5bc9e887",
            "name": "asdf",
            "number": 1006,
        }
    ]
}

但不知何故,swagger认为结果看起来像Array of Model:

[
  {
    "guid": "string",
    "name": "string",
    "number": 0,
  }
]

我也试过

[SwaggerResponse(200, Type = typeof(IPagedList<Model>))]

没有成功。

XPagedList 7.1.0 Swashbuckle.AspNetCore.Swagger 1.0.0

有没有办法可以覆盖输出? 如果代码错误,它会使客户端代码生成无用!

编辑: PagedList有一个自定义的JsonConverter

services.AddMvc().AddControllersAsServices().AddJsonOptions(options =>
{
    options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
    options.SerializerSettings.Converters.Add(new CustomIEnumerableConverter(new[] {"X.PagedList"}));
});

但据我所知,Swashbuckle应使用相同的JsonSerializer。

1 个答案:

答案 0 :(得分:1)

如果你想覆盖输出你可以使用 IDocumentFilter ,我在这里有几个例子: SwashbuckleTest/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs


现在我不确定为什么你的回复显示count, pageCount, totalItemCount那些不应该在响应上显示的内容,我创建了一个控制器来测试:

public class PagedListController : ApiController
{
    // GET: api/PagedList
    public IPagedList<Company> Get()
    {           
        return PagedCompany;
    }

    // GET: api/PagedList/5
    [SwaggerResponse(200, Type = typeof(IPagedList<Company>))]
    public async Task<IHttpActionResult> Get(int id)
    {
        return Ok(PagedCompany);
    }

    private IPagedList<Company> PagedCompany
    {
        get
        {
            var data = new List<Company>();
            for (int i = 0; i < 10; i++)
                data.Add(new Company { Id = i, Name = i.ToString() });
            return new PagedList<Company>(data, 1, 3);
        }
    }
}

而且你的回复中没有任何回复,你可以在这里试试: http://swashbuckletest.azurewebsites.net/swagger/ui/index?filter=PagedList#/PagedList/PagedList_Get