当前位置: 首页 > 知识库问答 >
问题:

使用Swasbuckle在web api的不同控制器中添加单独的自定义标头

韦寒
2023-03-14

控制器名称:Controller1,自定义标头:Header1

应为特定控制器下的所有 API 显示标头

共有2个答案

文喜
2023-03-14
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Collections.Generic;
using System.Web.Http.Description;
鲜于喜
2023-03-14

这可以通过将 OperationFilter 添加到您的 swagger 配置中来解决。首先,您必须提供一个实现 IOperationFilter 的类。Apply方法接收一个操作参数,该参数在标记字段中包含控制器名称。呈现 Swagger UI 时,将为 API 中的每个方法调用 Apply方法。您甚至可以为每个 API 方法提供单独的参数,因为操作还包含操作 Id。

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        if (operation.tags[0]?.CompareTo("Example") == 0)
        {
            operation.parameters.Add(new Parameter
            {
                name = "X-ExampleParam",
                @in = "header",
                @default = "42",  // optional default value, can be omitted
                type = "string",
                description = "My special parameter for the example API",
                required = true
            });
        }
        else if (operation.tags[0]?.CompareTo("Whatever") == 0)
        {
        // add other header parameters here
        }
    }
} 

在调试器中,使用名为<code>ExampleController</code>的控制器,它如下所示:

通过在 SwaggerConfig 类的 Register 方法中添加一行来告诉 Swagger 使用 OperationFilter:

public class SwaggerConfig
{
    public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        //GlobalConfiguration.Configuration
        config
            .EnableSwagger(c =>
                {
                ... // omitted some lines here
                c.OperationFilter<AddRequiredHeaderParameter>(); // Add this line
                ... // omitted some lines here
                })

     } 

这个解决方案的想法是基于ShaTin的答案:如何在Swagger UI中发送带有请求的自定义标头?

 类似资料:
  • 这个问题已经被问过了,但从那时起,所有的答案(我能找到)都不再有效。 本质上,我想用Vaadin(V23)实现一个网站,该网站通过另一台服务器(物理)上运行的POST请求与WebApp进行通信。为此,我想创建单独的Servlet来处理与另一台服务器的通信(接收方)。比如说,这不是嵌入式版本: 然而,问题是,无论我做什么,我总是被重定向到默认的dispatcher Servlet: > Spring

  • 只是所有的估计日期都不一样… 我的问题是,我似乎无法针对特定的实例。我只能选择整个方法(固定费率),我检查了我的方法实例ID,因为它们是唯一的: 但只有当我把作为php开关方法的一个例子时,它才起作用。2,3,4,5,7不工作。 这是我的代码: 代码显然会对我所有的运输方法产生所有相同的估计。 谢谢! 我在用这个: 大小写'flat_rate':$标签。='Lieferzeit: 2-3标签平';

  • 至少我可以添加一个产品,但我想添加更多的函数,如: WooCommerce总是只拿最后一个。

  • 我正在Flutter中开发我自己的应用程序,我想使用一些我自己制作的图标。我已经使用了font_awesome_flutter提供的一些图标,但是在我的代码的这一点上,我想添加一些其他的图标(svgs或pngs),这些图标不包括在这个包中,以使它更加个性化。 这就是我的应用程序组织: 代码组织 这就是我想要实现自己的图片upct的代码部分。巴布亚新几内亚: 非常感谢你!

  • 我有一个正在构建的搜索结果页面,它将帖子分为三个类别(产品、食谱、文章),在页面的下面三个单独的部分。类别(菜谱和文章)很好,也很简单——创建一个查询以在两个单独的循环中使用,但是我在自定义帖子类型方面遇到了问题。 如果可能的话,我想在循环中引入这些,但不确定是在post类型上还是在分类法上这样做。很明显,这些产品在分类法下被划分为子类别,所以当我尝试它时,它多次拉同一个产品。 现在,我已经放弃了

  • 我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。 项目结构: null 布尔马尔科 完全错误: 原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.