У меня есть простой проект веб-API2, который использует чванство для документации.
Учитывая простую конечную точку GET, которая использует параметры маршрута и параметры запроса, такие как:
[HttpGet]
[Route("api/v2/items/{itemid:int}")]
public IHttpActionResult Getv2(int itemId, [FromUri(Name ="")]DTOv1 request)
{
return Ok();
}
public class DTOv1
{
public DateTime? StartValue { get; set; }
}
Это дает следующую документацию:
Однако я хотел бы иметь возможность указать все элементы в POCO. Такие как:
[HttpGet]
[Route("api/v3/items/{itemid:int}")]
public IHttpActionResult Getv3([FromUri(Name ="")]DTOv2 request)
{
return Ok();
}
public class DTOv2
{
public int ItemId { get; set; }
public DateTime? StartValue { get; set; }
}
Это дает следующую неправильную документацию:
Эта конечная точка GET работает так же, как и первый пример, но, как вы можете видеть, документация не работает, и попытка сделать пример не сработает. Можно ли настроить swagger так, чтобы это было задокументировано так же, как в первом примере, в идеале на основе соглашения?
Swagger просто использует настройку по умолчанию:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "TestSwagger");
c.PrettyPrint();
})
.EnableSwaggerUi(c =>
{
});
РЕДАКТИРОВАТЬ:
Благодаря ответу о добавлении фильтров я написал следующий фильтр операции, который работает в нашем случае использования для управления параметрами:
private class OperationFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (apiDescription.HttpMethod.Method == "GET")
{
var pathParams = operation.parameters.Where(x => x.@in == "path");
var toRemoveItems = new List<Parameter>();
foreach(var pathParam in pathParams)
{
toRemoveItems.AddRange(operation
.parameters
.Where(x => x.@in != "path" && x.name.EndsWith(pathParam.name)));
}
foreach(var toRemove in toRemoveItems)
{
operation.parameters.Remove(toRemove);
}
}
}
}
IDocumentFilter
), который даст вам 100% контроль над окончательным swagger.json, но имейте в виду, что вы можете получить что-то, что не соответствует OAS 2.0. - person Helder Sepulveda   schedule 16.01.2018[Route("api/v3/items/{itemid:int}")]
должно быть[Route("api/v3/items/{ItemId}")]
. Это, по крайней мере, устанавливает параметр как параметр пути - person Paul Wild   schedule 17.01.2018