希望有人尝试过使用 MVC 6 和 Swagger 中的版本化 API 进行类似的操作,以显示有关不同版本的文档。
我根据这个 ASP.NET 5 存储库在 MVC 6 中使用推荐的 API 版本控制。我所做的唯一更改是从请求的自定义 http 标头中读取 api 版本的 GetVersion 方法:
//in VersionRangeValidator.cs
public static string GetVersion(HttpRequest request)
{
//return request.Query["version"];
if (!string.IsNullOrWhiteSpace(request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName]))
{
return request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName];
}
return Constants.CommonRoutingDefinitions.CurrentApiVersion;
}
我有一个这样的控制器:
[Route("api/[controller]")]
[Produces(Constants.MediaTypeNames.ApplicationJson)]
public class TagsController : Controller
{
private readonly ITagService _tagService;
public TagsController(ITagService tagService)
{
_tagService = tagService;
}
/// <summary>
/// Version 1 by default
/// </summary>
/// <returns>All the tags</returns>
[HttpGet]
[Produces(typeof(IEnumerable<Tag>))]
public IEnumerable<Tag> GetTags()
{
IEnumerable<Tag> tags = _tagService.GetTags();
return tags;
}
/// <summary>
/// Version 2
/// </summary>
/// <returns>All the tags V2</returns>
[VersionGet("", versionRange: "[2]")]
public IEnumerable<Tag> GetTagsV2()
{
IList<Tag> tags = new List<Tag>
{
new Tag { Id = 1, Links = Enumerable.Empty<Link>().ToList(), Name = "Tag version 2" }
};
return tags;
}
}
版本控制使用自定义 http 标头进行,以便
获取 /api/标签
内容类型:应用程序/json
默认情况下会触发 GetTags() 操作,因为没有指定标题并且
获取 /api/标签
api版本:2
内容类型:应用程序/json
将点击 GetTagsV2() 动作。
我已经按照此博客中的步骤添加了 Swagger UI 和 Swagger GEN 库,因此在我project.json
的依赖项中:
"Swashbuckle.SwaggerGen": "6.0.0-rc1-final",
"Swashbuckle.SwaggerUi": "6.0.0-rc1-final"
然后在我的 Startup.cs 中,我将 Swagger 添加到管道中
//inside Configure(IApplicationBuilder app)
app.UseSwaggerGen();
app.UseSwaggerUi();
我将 Swagger 配置如下:
private void ConfigureSwagger(IServiceCollection services)
{
services.AddSwaggerGen();
services.ConfigureSwaggerDocument(options =>
{
options.MultipleApiVersions(new Swashbuckle.SwaggerGen.Info[]
{
new Swashbuckle.SwaggerGen.Info
{
Version = "v1",
Title = "MyApp API",
Description = "A RESTful API"
},
new Swashbuckle.SwaggerGen.Info
{
Version = "v2",
Title = "MyApp API (v2)",
Description = "A RESTful API"
}
}, (description, version) => {
//description is an instance of ApiDescription and
//version is either "v1" or "v2"
//depending on the user choice in swagger UI page
//TODO, how can I know whether the action belongs to v1 or to v2 to return true or false as appropriate?
});
options.OperationFilter(new Swashbuckle.SwaggerGen.XmlComments.ApplyXmlActionComments(Configuration["Documentation:SwaggerDocXml"]));
});
services.ConfigureSwaggerSchema(options =>
{
options.DescribeAllEnumsAsStrings = true;
options.ModelFilter(new Swashbuckle.SwaggerGen.XmlComments.ApplyXmlTypeComments(Configuration["Documentation:SwaggerDocXml"]));
});
}
问题是我不知道如何从描述(这是 Microsoft.AspNet.Mvc.ApiExplorer.ApiDescription 的一个实例)中获取必要的信息来了解是否必须在 Swagger UI 中显示给定的操作,具体取决于在指定版本上。任何提示将不胜感激。这将有助于理解这个用于版本控制的 ASP.NET 5 存储库实现是如何工作的,因为我仍然不能很好地理解它,也找不到关于操作约束如何工作的好的解释。
PS:这个 stackoverflow 问题帮助我使用 MVC 6 实现版本控制,但我找不到太多关于 Swagger 如何与这种 API 版本控制方式集成的信息。