【问题标题】:How to create Web API that can be imported into Azure API Management Portal如何创建可导入 Azure API 管理门户的 Web API
【发布时间】:2019-10-29 08:52:27
【问题描述】:

所以我对 Azure API 管理门户做了一些改动。我已经按照how the import the conference api 上的教程进行操作,并设法让它工作。

然后我创建了一个使用 swagger 的 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 UI,当我点击swagger UI上的链接或访问url https://my-api.azurewebsites.net/swagger/v1/swagger.json时,我还可以看到规范

所以我的问题是,我不知道如何将其实际导入 AAMP。我可以将它发布到应用服务,它可以从那里工作,但如果我尝试将 url https://my-api.azurewebsites.net/swagger/v1/swagger.json 导入 AAMP,我会收到错误:

所以我等了一个小时再试一次,只是遇到同样的错误,我想我遗漏了一些东西,因为当我导入会议 api 规范时,它的 url 与我的不同,但我找不到任何东西或我正在寻找错误的东西。有人可以在这里给我提个醒吗?

我也尝试过搜索会议 API 的来源,这样我就可以推断出我做错了什么,但我没有找到这些。

【问题讨论】:

    标签: swagger asp.net-core-webapi azure-api-management


    【解决方案1】:

    按照此 Azure 文档将 Swagger 文档导入 APIM 非常简单。导入 Swagger 1.2 文档时没有问题。但是,如果您打算导入 Swagger 2.0,您可能会遇到此类问题

    如果您正在使用 .NET Framework 4.5+ 构建 API 应用程序,使用 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 即可。

    Reference:

    希望对你有帮助。

    【讨论】:

    • 谢谢哥们,我明天上班的时候试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多