Как создать веб-API, который можно импортировать в портал управления API Azure - PullRequest
0 голосов
/ 14 июня 2019

, поэтому я немного повозился с порталом управления API Azure.Я следовал руководству по , как импортировать API конференции , и сумел заставить его работать.

Затем я создал приложение WebApi, которое использует чванство.Моя конфигурация выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
    });
    ...
}
public void Configure(IApplicationBuilder app,
    IServiceProvider services, 
    IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseSwagger();

    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "Address Service API");
    });

    app.UseHttpsRedirection();
    app.UseMvc();
}

Если я запускаю это и перехожу на https://my-api/swagger, я вижу пользовательский интерфейс Swagger и спецификации, когда я нажимаю на ссылку в пользовательском интерфейсе Swagger илипосетите URL https://my-api.azurewebsites.net/swagger/v1/swagger.json

Так что моя проблема в том, что я понятия не имею, как на самом деле импортировать это в AAMP.Я могу опубликовать его в службе приложений, и он оттуда работает, но если я пытаюсь импортировать URL https://my-api.azurewebsites.net/swagger/v1/swagger.json в AAMP, я получаю сообщение об ошибке:

enter image description here

Итак, я подожду час и попробую снова, только та же самая ошибка встречает меня, и я думаю, что что-то упустил, потому что когда я импортировал спецификацию api конференции, у нее был URL, отличный от моего, но я не могу найтичто-нибудь или я ищу неправильные вещи.Кто-нибудь может подсказать, пожалуйста, здесь?

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

1 Ответ

0 голосов
/ 17 июня 2019

Импортировать документ Swagger в APIM довольно просто, следуя этому документу Azure. При импорте документов Swagger 1.2 проблем не возникает. Однако, если вы собираетесь импортировать Swagger 2.0, вы можете столкнуться с такой проблемой

Если вы создаете приложение API с .NET Framework 4.5+, используя библиотеку Swashbuckle, все будет в порядке. Однако, если вы создаете приложение с помощью ASP.NET Core, это приносит вам головную боль. Во-первых, посмотрите на ваш файл Startup.cs. Метод ConfigureService выглядит следующим образом:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    ...

    services.AddSwaggerGen();

    services.ConfigureSwaggerDocument(
        options =>
        {
            options.SingleApiVersion(new Info() { Version = "v1", Title = "Swagger UI" });
            options.IgnoreObsoleteActions = true;
            options.OperationFilter(new ApplyXmlActionComments(GetXmlPath(appEnv)));
        });

    services.ConfigureSwaggerSchema(
        options =>
        {
            options.DescribeAllEnumsAsStrings = true;
            options.IgnoreObsoleteProperties = true;
            options.CustomSchemaIds(type => type.FriendlyId(true));
            options.ModelFilter(new ApplyXmlTypeComments(GetXmlPath(appEnv)));
        });

    ...
}

private static string GetXmlPath(IApplicationEnvironment appEnv)
{
    var assembly = typeof(Startup).GetTypeInfo().Assembly;
    var assemblyName = assembly.GetName().Name;

    var path = $@"{appEnv.ApplicationBasePath}\{assemblyName}.xml";
    if (File.Exists(path))
    {
        return path;
    }

    var config = appEnv.Configuration;
    var runtime = $"{appEnv.RuntimeFramework.Identifier.ToLower()}{appEnv.RuntimeFramework.Version.ToString().Replace(".", string.Empty)}";
    path = $@"{appEnv.ApplicationBasePath}\..\..\artifacts\bin\{assemblyName}\{config}\{runtime}\{assemblyName}.xml";
    return path;
}

В дополнение к этому метод Configure может выглядеть следующим образом:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseSwaggerGen();
    app.UseSwaggerUi();

    ...
}

Нам нужно включить два дополнительных свойства - хост и схемы. Спецификация Swagger ясно заявляет, что оба НЕ обязательны. Однако APIM требует, чтобы оба свойства были включены в документ swagger.json.

Итак, как мы можем с этим разобраться?

Для вашего приложения в .NET 4.5+ просто убедитесь, что ваш SwaggerConfig.cs активировал эти параметры с правильными настройками:

SwaggerDocsConfig.Schemes(new[] { “http”, “https” });
SwaggerDocsConfig.RootUrl(req => GetRootUrlFromAppConfig());

В вашем приложении ASP.NET Core это может быть сложно, так как вам следует реализовать интерфейс IDocumentFilter. Вот пример кода:

  public class SchemaDocumentFilter : IDocumentFilter
    {
      public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
      {
        swaggerDoc.Host = "localhost:44321";
        swaggerDoc.BasePath = "/";
        swaggerDoc.Schemes = new List<string>() { "https" };
      }
    }

And this SchemaDocumentFilter should be added into your ConfigureService method in Startup.cs:

public static void ConfigureServices(this IServiceCollection services)
{
  ...

  services.AddSwaggerGen();

  services.ConfigureSwaggerDocument(
    options =>
      {
        options.SingleApiVersion(new Info() { Version = "v1", Title = "Swagger UI" });
        options.IgnoreObsoleteActions = true;
        options.OperationFilter(new ApplyXmlActionComments(GetXmlPath(appEnv)));

        options.DocumentFilter<SchemaDocumentFilter>();
      });

  services.ConfigureSwaggerSchema(
    options =>
      {
        options.DescribeAllEnumsAsStrings = true;
        options.IgnoreObsoleteProperties = true;
        options.CustomSchemaIds(type => type.FriendlyId(true));
        options.ModelFilter(new ApplyXmlTypeComments(GetXmlPath(appEnv)));
      });

  ...
}

Как только вы завершите это, затем импортируйте ваш swagger.json в APIM, тогда он должен работать.

Ссылка

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...