Есть ли способ настроить конечные точки заказа в NSwag?

#c# #swagger #nswag #codegen

#c# #развязность #nswag #codegen

Вопрос:

Я использую NSwag для создания документации по коду, но хотел бы иметь возможность настраивать, в каком порядке конечные точки отображаются в сгенерированной конечной точке swagger. Возможно, через атрибут в методах контроллера.

Я не вижу никакого способа добиться этого. В нескольких других сообщениях упоминается буквенно-цифровой порядок, но мне нужно иметь возможность определять пользовательский порядок. Есть ли какой-либо способ сделать это?

Мой SwaggerConfig

 public class SwaggerApiConfig
  {
    public Assembly TargetWebAssembly { get; }

    public Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> ConfigureUiSettings { get; }

    public SwaggerApiConfig(
      string uiRoute,
      Assembly targetWebAssembly,
      string apiName,
      string description,
      string team = null,
      string appDocumentationUrl = null)
    {
      if (!uiRoute.StartsWith("/"))
        uiRoute = string.Format("/{0}", (object) uiRoute);
      this.TargetWebAssembly = targetWebAssembly;
      this.ConfigureUiSettings = SwaggerApiConfig.BuildSwaggerUiSettings(uiRoute, this.TargetWebAssembly, apiName, description, team, appDocumentationUrl);
    }

    public SwaggerApiConfig(
      Assembly targetWebAssembly,
      Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> configureUiSettings)
    {
      this.TargetWebAssembly = targetWebAssembly;
      this.ConfigureUiSettings = configureUiSettings;
    }

    public static Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> BuildSwaggerUiSettings(
      string uiRoute,
      Assembly targetWebAssembly,
      string apiName,
      string description,
      string team = null,
      string appDocumentationUrl = null)
    {
      if (!uiRoute.StartsWith("/"))
        uiRoute = string.Format("/{0}", (object) uiRoute);
      return (Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>>) (settings =>
      {
        settings.SwaggerUiRoute = uiRoute;
        settings.SwaggerRoute = string.Format("{0}/swagger.json", (object) uiRoute);
        settings.DocExpansion = "list";
        settings.GeneratorSettings.Title = apiName;
        settings.GeneratorSettings.Version = string.Format("{0}", (object) targetWebAssembly.GetName().Version);
        settings.GeneratorSettings.Description = description;
        settings.GeneratorSettings.IgnoreObsoleteProperties = false;
        settings.GeneratorSettings.GenerateKnownTypes = true;
        settings.GeneratorSettings.GenerateAbstractProperties = true;
        settings.GeneratorSettings.DefaultEnumHandling = EnumHandling.String;
        settings.GeneratorSettings.OperationProcessors.Add((IOperationProcessor) new CallerHeaderOperationProcessor());
        
        settings.PostProcess = (Action<SwaggerDocument>) (x =>
        {
          x.Security = (ICollection<SwaggerSecurityRequirement>) new List<SwaggerSecurityRequirement>();
          x.Info.Contact = new SwaggerContact()
          {
            Name = team,
            Url = appDocumentationUrl
          };
        });
      });
    }
 

Как это затем применяется в моем приложении

  if (swaggerApiOptions != null)
                {
                    foreach (var swaggerApiConfig in swaggerApiOptions.Configurations)
                    {
                        appBuilder.UseSwaggerUi3(swaggerApiConfig.TargetWebAssembly, swaggerApiConfig.ConfigureUiSettings);
                    }
                }
 

Комментарии:

1. Может быть, проверить github.com/RicoSuter/NSwag/issues/2879 ): > * Рикосьютер: Вы можете попытаться изменить порядок элементов в спецификации с помощью обработчика документов или постпроцесса. > * Saibamen: Как? > * RicoSuter: при последующей обработке вы переупорядочиваете коллекцию путей документа…

Ответ №1:

Это, скорее всего, не даст вам всего, что вам нужно, но стоит отметить, что класс SwaggerUi3Settings содержит OperationsSorter настройку.