【问题标题】:Leverage MultipleApiVersions in Swagger with attribute versioning通过属性版本控制在 Swagger 中利用 MultipleApiVersions
【发布时间】:2015-08-27 15:15:37
【问题描述】:

在使用属性路由时是否可以在 Swagger UI / Swashbuckle 中利用 MultipleApiVersions?

具体来说,我通过以下方式实现版本控制:

using System.Web.Http;

namespace RESTServices.Controllers.v1
{
    [Route("api/v1/Test")]
    public class TestV1Controller : ApiController
    { ... }

版本 2 将位于 v2 命名空间中。在名为 TestV2Controller 的控制器中。该路线将包含 v2。

是否可以传递一个允许这样做的 lambda?我在网上找到了一个编译的示例 lambda,但随后 Swagger 完全停止工作。无法在浏览器中设置断点或查看 Swagger。

【问题讨论】:

    标签: attributes asp.net-web-api2 swagger swagger-ui swashbuckle


    【解决方案1】:
    .EnableSwagger(c => c.MultipleApiVersions(
            (apiDesc, version) =>
            {
                var path = apiDesc.RelativePath.Split('/');
                var pathVersion = path[1];
    
                return CultureInfo.InvariantCulture.CompareInfo.IndexOf(pathVersion, version, CompareOptions.IgnoreCase) >= 0;
            },
            vc =>
            {
                vc.Version("v2", "Swashbuckle Dummy API V2"); //add this line when v2 is released
    
                // ReSharper disable once ConvertToLambdaExpression
                vc.Version("v1", "Swashbuckle Dummy API V1");
            }
            ))
    

    【讨论】:

    • 我认为上面“Swashbuckle Dummy API V2”的第二次出现应该以“V1”而不是“V2”结尾?
    • 我找不到适合此要求的参考文档。你的回答就像一个魅力。谢谢!
    【解决方案2】:

    Swagger 支持多个版本。 配置 URL,以便 Swagger 可以正确指定版本。

    httpConfiguration
    .EnableSwagger(c =>
        {
            c.MultipleApiVersions(
                (apiDesc, targetApiVersion) => ResolveVersionSupportByRouteConstraint(apiDesc, targetApiVersion),
                (vc) =>
                {
                    vc.Version("v2", "Swashbuckle Dummy API V2");
                    vc.Version("v1", "Swashbuckle Dummy API V1");
                });
        });
    .EnableSwaggerUi(c =>
        {
            c.EnableDiscoveryUrlSelector();
        });
    
    
        private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
        {
            return apiDesc.ActionDescriptor.ControllerDescriptor.ControllerType.FullName.Contains($"{targetApiVersion}.");
        }
    

    参考资料:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多