Swagger OData с использованием Swashbucke для гибридных сервисов C# WebApi

Я создаю службу 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));
        })

...


person Murray Foxcroft    schedule 23.05.2016    source источник
comment
Итак, вы хотите, чтобы Swagger.OData визуализировал вашу службу, использующую некоторые свойства OData, но вы не хотите делать свою службу службой OData... Возможно, вам придется немного подробнее остановиться на этом. Мой вопрос к вам просто почему? Вы можете иметь OData и другие службы Rest на одном сайте, вы даже можете иметь действия без OData на своих контроллерах OData, если хотите. Тогда документы Swagger действительно работают из коробки.   -  person Chris Schaller    schedule 28.06.2017