在Swagger中隐藏Route属性

时间:2019-08-02 21:51:31

标签: c# .net swagger

是否可以在Swagger JSON定义中隐藏路线的自定义属性?我有另一个调用API的应用程序,它读取Swagger以获得更多信息。

例如,我想指出该路由需要Active Directory。调用应用程序将执行验证以确保AD可用。

我查看了OperationsFilter,但是它将Parameter插入到Swagger定义中。我还考虑过使用Tag,但它无法实现我所需的功能,并且与UI混淆。

我们在.NET Core 2.0项目中使用Swagger注释。理想情况下,我想通过注释来做到这一点,但没有找到我可以使用的任何东西。

    [HttpGet]
    [Route("api/")]
    [SwaggerOperation(
        Summary = "Some Service",
        Description = "Some Service",
        OperationId = "getMyStuff",
        Tags = new[] { "MyStuff" }
    )]
    [SwaggerResponse(200, "Response object returned")]
    [SwaggerResponse(400, "Response object returned")]
    public ActionResult<Response> GetStuff()
    {...code here...}

1 个答案:

答案 0 :(得分:0)

我找到了答案。基本上,我要添加一个特定于路由的扩展。

定义自定义属性类

// allow mutliple attributes specified in data annotations
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
// model for custom attribute class
public class CustomAttribute : Attribute
{
    public string ParameterName { get; set; }
    public string Value { get; set; }
    public string Description { get; set; }

    public CustomAttribute(string parameterName, string value, string description = null)
    {
        this.ParameterName = parameterName;
        this.Value = value;
        this.Description = description;
    }
}

创建摇摇欲坠的操作过滤器

public class CustomAttributeOperationFilter : IOperationFilter
{
    // variables
    MethodInfo _methodInfo;

    public void Apply(Operation operation, OperationFilterContext context)
    {
        context.ApiDescription.TryGetMethodInfo(out _methodInfo);

        var attributes = _methodInfo.GetCustomAttributes<CustomAttribute>();
        foreach (var atrib in attributes)
            operation.Extensions.Add(atrib.ParameterName, atrib.Value);
    }
}

在startups.cs中,更新招摇注册以包括自定义操作过滤器

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("helloworld", new Info {Title = "HelloWorld API"});
            c.EnableAnnotations();
            c.OperationFilter<CustomAttributeOperationFilter>();

        });

最后,在API定义中指定自定义属性

    [HttpGet]
    [CustomAttribute("x-accept-apples, "yes")]
    [CustomAttribute("x-accept-pears, "no")]
    public ActionResult<Response> Get()
    {
        return Ok();
    }