Я создаю службу WebApi2 с использованием С#. Это сервис, основанный на ресурсах, следующий подходу RESTful. Ресурс будет доступен через API и представлен через веб-страницу в сетке, где это уровень сортировки, разбиения по страницам и фильтрации требуемого ресурса.
Чтобы не изобретать велосипед, я использовал параметры запроса oData и пометил вызов GET с помощью [EnableQuery]
. Это дает мне возможности сортировки, разбиения по страницам и фильтрации, которые мне нужны, с минимальным кодом, и это прекрасно работает (пример реализации ниже).
Однако сейчас я пытаюсь подключить Swashbuckle для документирования моего API. Поскольку моя служба не является чистой службой OData, Swashbuckle.OData не распознает ее, и я не получаю параметры запроса (OData), добавленные в документацию, я просто получаю простой интерфейс службы.
Я начал отлаживать кроличью нору с помощью Swashbuckle.OData, но потом подумал, что лучше спросить сначала и, надеюсь, сэкономить время. При беглом взгляде на код он обрабатывает обработку OData и WebApi отдельно, а затем объединяет полученные документы вместе. Мой сервис представляет собой гибрид двух и относится к категории WebApi.
У меня есть работа с OperationFilter
для Swashbuckle (см. код ниже, измененный из этого сообщения), но было бы неплохо получить это из коробки с помощью Swashbuckle.OData — я упустил какой-то трюк?
--------- Пример API ----------
[ResponseType(typeof(IQueryable<MyResource>))]
[EnableQuery]
public IQueryable<MyResource> GetMyResources()
{
return repository.MyResources.AsQueryable();
}
----- Временное решение ------
public class ODataParameterFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (apiDescription.ResponseDescription.ResponseType != null && apiDescription.ResponseDescription.ResponseType.Name.ToLower().Contains("queryable"))
{
Dictionary<string, string> parameters = new Dictionary<string, string>()
{
{ "$top", "The max number of records. (e.g. $top=10)"},
{ "$skip", "The number of records to skip. (e.g. $skip=5)"},
{ "$filter", "A function that must evaluate to true for a record to be returned. (e.g. $filter=CustomerName eq 'bob')"},
{ "$select", "Specifies a subset of properties to return. (e.g. $select=Name)"},
{ "$orderby", "Determines what values are used to order a collection of records. (e.g. $orderby=Address1_Country,Address1_City desc)"}
};
operation.parameters = new List<Parameter>();
foreach (var pair in parameters)
{
operation.parameters.Add(new Parameter
{
name = pair.Key,
required = false,
type = "string",
@in = "query",
description = pair.Value
});
}
}
}
-------- Мой SwaggerConfig.cs -------
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "My Service");
c.CustomProvider(defaultProvider => new ODataSwaggerProvider(defaultProvider, c));
})
...