IPagedList<T> 的 Swashbuckle 响应错误
Swashbuckle response is wrong with IPagedList<T>
我有一个 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,
}
]
}
但不知何故大摇大摆地认为结果看起来像模型数组:
[
{
"guid": "string",
"name": "string",
"number": 0,
}
]
我也试过
[SwaggerResponse(200, Type = typeof(IPagedList<Model>))]
没有成功。
XPagedList 7.1.0
Swashbuckle.AspNetCore.Swagger1.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。
如果你想覆盖输出,你可以使用 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
我有一个 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,
}
]
}
但不知何故大摇大摆地认为结果看起来像模型数组:
[
{
"guid": "string",
"name": "string",
"number": 0,
}
]
我也试过
[SwaggerResponse(200, Type = typeof(IPagedList<Model>))]
没有成功。
XPagedList 7.1.0 Swashbuckle.AspNetCore.Swagger1.0.0
有什么方法可以覆盖输出吗? 如果代码错误,它会使客户端代码生成无用!
编辑: PagedList
有一个自定义的 JsonConverterservices.AddMvc().AddControllersAsServices().AddJsonOptions(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
options.SerializerSettings.Converters.Add(new CustomIEnumerableConverter(new[] {"X.PagedList"}));
});
但据我了解,Swashbuckle 应该使用相同的 JsonSerializer。
如果你想覆盖输出,你可以使用 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