Импортировать документ 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, тогда он должен работать.
Ссылка
Надеюсь, это поможет.