Исключить некоторые модели из генерируемой Swashbuckle схемы Swagger в ASP. Net Базовом проекте OData - PullRequest
0 голосов
/ 21 января 2020

Я использую Swashbuckle для генерации документации Swagger для моего проекта ASP. Net Core 3.1 OData.

Генерация методов контроллеров идеальна. И он правильно генерирует схему на основе моделей, за исключением одного:

Для каждой модели в схеме также генерируется дополнительная запись [ModelName]IQueryableODataValue, как показано на снимке экрана ниже:

swagger doc screenshot

Синий флажок указывает модель. Записи модели, обведенные красным, являются лишними записями, которые также добавляются.

Обратите внимание, что также создается модель Void, также обведенная красным.

Как получить чванство документация, чтобы пропустить записи модели, которые я обведен красным? Я подозреваю, что это связано с добавлением SchemaFilter. Но я не могу понять, как применить его для решения этой проблемы.

РЕДАКТИРОВАТЬ: комментарий @ 0909EM побудил меня еще немного покопаться в SchemaFilter, и в итоге я применил следующий SchemaFilter:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;

namespace MyProject.SwaggerConfig
{
    public class RemoveBogusDefinitions : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            foreach (var item in context.SchemaRepository.Schemas.Keys.Where(r => r.EndsWith("ODataValue")))
                context.SchemaRepository.Schemas.Remove(item);

            context.SchemaRepository.Schemas.Remove("Void");
        }
    }
}

Это работает до тех пор, пока LAST schema, добавленный к context, является допустимой моделью, которую я хочу сохранить. Проблема в том, что приведенный выше код выполняется, а затем schema добавляется к context. Поэтому, если последняя обрабатываемая schema окажется той, которую я хочу исключить, приведенный выше код этого не сделает.

Как предотвратить добавление schema в context

1 Ответ

0 голосов
/ 20 апреля 2020

В моем случае только это сработало:

   internal class SwaggerSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                var keys = new System.Collections.Generic.List<string>();
                var prefix = "My.Namespace";
                foreach(var key in context.SchemaRepository.Schemas.Keys)
                {
                   if (key.StartsWith(prefix))
                    {
                        keys.Add(key);
                    }
                }
                foreach(var key in keys)
                {
                    context.SchemaRepository.Schemas.Remove(key);
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...