gpt4 book ai didi

c# - 如何有选择地将 OperationFilter 添加到 Swagger 中的 API 端点?

转载 作者:行者123 更新时间:2023-12-05 02:38:09 24 4
gpt4 key购买 nike

我有以下 IOperationFilter 类,它实现了我的 API 应用程序中某些端点所需的身份验证 header :

public class AuthenticationHeadersFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Parameters == null)
operation.Parameters = new List<OpenApiParameter>();

operation.Parameters.Add(new OpenApiParameter
{
Name = "AccountName",
In = ParameterLocation.Header,
Required = true
});

operation.Parameters.Add(new OpenApiParameter
{
Name = "ApiKey",
In = ParameterLocation.Header,
Required = true
});
}
}

通过 Startup.csConfigureServices 方法将以上内容添加到我的应用程序的 Swagger UI 中:

services.AddSwaggerGen(c =>
{
// ...
// other Swagger configurations
// ...
c.OperationFilter<AuthenticationHeadersFilter>();
});

这很好用,但是我现在也有一些端点,我希望由 Swagger 记录/显示这些端点,但应该完全公开访问而无需用户提供 AccountNameApiKey 作为其 API 请求中的 header 。我怎样才能做到这一点?

我找到了 this Stack Overflow answer ,但不确定是否可以根据我的目的进行调整。我找不到任何关于 OperationFilterContext 类的有用文档。

非常感谢任何帮助。

最佳答案

可能的解决方案是拥有这样的属性

using System;

namespace some.namespace
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SkipAuthenticationHeadersAttribute : Attribute
{
}
}

并像这样在 swagger AuthenticationHeadersFilter 中使用它:

using System.Linq;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace some.namespace
{
/// <summary>
/// https://alexdunn.org/2018/06/29/adding-a-required-http-header-to-your-swagger-ui-with-swashbuckle/.
/// </summary>
public class AuthenticationHeadersFilter : IOperationFilter
{
/// <summary>
/// Swagger: Creates new required http header.
/// </summary>
/// <param name="operation"> Open Api Operation.</param>
/// <param name="context">Operation Filter Context.</param>
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var globalAttributes = context.ApiDescription.ActionDescriptor.FilterDescriptors.Select(p => p.Filter);
var controllerAttributes = context.MethodInfo?.DeclaringType?.GetCustomAttributes(true);
var methodAttributes = context.MethodInfo?.GetCustomAttributes(true);
var produceAttributes = globalAttributes
.Union(controllerAttributes ?? throw new InvalidOperationException())
.Union(methodAttributes)
.OfType<SkipAuthenticationHeadersAttribute>()
.ToList();

if (produceAttributes.Count != 0)
{
return;
}

if (operation.Parameters == null)
{
operation.Parameters = new List<OpenApiParameter>();
}

operation.Parameters.Add(new OpenApiParameter
{
Name = "AccountName",
In = ParameterLocation.Header,
Required = true
});

operation.Parameters.Add(new OpenApiParameter
{
Name = "ApiKey",
In = ParameterLocation.Header,
Required = true
});
}
}
}

因此,当您将属性添加到 Controller 操作时,该操作会被过滤掉。

关于c# - 如何有选择地将 OperationFilter 添加到 Swagger 中的 API 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69732697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com