如何在 .NET Core 中实现处理自定义属性的 Swashbuckle IOperationFilter
How to implement a Swashbuckle IOperationFilter that processes custom attributes in .NET Core
我已经实现了 Swashbuckle.Swagger.IOperationFilter
来处理自定义属性,如下所述:
我现在想为 Swashbuckle.AspNetCore 5.0.0
做类似的事情。
似乎 ApiDescription
class 没有在原始实现中使用的扩展方法 GetControllerAndActionAttributes
。我尝试通过查看它的 source code 来重新实现它,但它使用的成员 ApiDescription.ActionDescriptor.ControllerDescriptor
和 ApiDescription.ActionDescriptor.GetCustomAttributes<TAttribute>
对于 .NET Core 我似乎不存在。
任何人都可以通过向我展示如何从 IOperationFilter
获取自定义控制器和操作属性来帮助我入门吗?
更新
看起来 .NET Framework 实现有一个 ActionDescriptor
,实际上是一个 ReflectedActionDescriptor。这个 class 有一个带有 MethodInfo
的构造函数,用于查找属性。
但我看不出有什么方法可以获得 .NET Core 实现的 MethodInfo
Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor。
我找到了我的答案:有一个扩展方法 ApiDescription.TryGetMethodInfo
可以获取 MethodInfo
并因此可以访问自定义属性。
使用这样的代码:
var attributes = apiDescription.GetControllerAndActionAttributes<AuthorizeAttribute>();
if (!attributes.IsNullOrEmpty())
{
var param = new Parameter
{
name = "Authorization",
@in = "header",
description = "Bearer + access token",
required = false,
type = "string"
};
if (operation.parameters == null)
operation.parameters = new List<Parameter> { param };
else
operation.parameters.Add(param);
}
我已经实现了 Swashbuckle.Swagger.IOperationFilter
来处理自定义属性,如下所述:
我现在想为 Swashbuckle.AspNetCore 5.0.0
做类似的事情。
似乎 ApiDescription
class 没有在原始实现中使用的扩展方法 GetControllerAndActionAttributes
。我尝试通过查看它的 source code 来重新实现它,但它使用的成员 ApiDescription.ActionDescriptor.ControllerDescriptor
和 ApiDescription.ActionDescriptor.GetCustomAttributes<TAttribute>
对于 .NET Core 我似乎不存在。
任何人都可以通过向我展示如何从 IOperationFilter
获取自定义控制器和操作属性来帮助我入门吗?
更新
看起来 .NET Framework 实现有一个 ActionDescriptor
,实际上是一个 ReflectedActionDescriptor。这个 class 有一个带有 MethodInfo
的构造函数,用于查找属性。
但我看不出有什么方法可以获得 .NET Core 实现的 MethodInfo
Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor。
我找到了我的答案:有一个扩展方法 ApiDescription.TryGetMethodInfo
可以获取 MethodInfo
并因此可以访问自定义属性。
使用这样的代码:
var attributes = apiDescription.GetControllerAndActionAttributes<AuthorizeAttribute>();
if (!attributes.IsNullOrEmpty())
{
var param = new Parameter
{
name = "Authorization",
@in = "header",
description = "Bearer + access token",
required = false,
type = "string"
};
if (operation.parameters == null)
operation.parameters = new List<Parameter> { param };
else
operation.parameters.Add(param);
}