【问题标题】:Enforce mandatory request headers on .Net Core WebAPI?在 .Net Core WebAPI 上强制执行请求标头?
【发布时间】:2022-08-19 08:15:29
【问题描述】:

是否有一种标准方法可以在 .Net Core Web API 中强制执行请求标头?我希望所有呼叫者应用程序都传递一些跟踪标头,以便我对呼叫量有一些可追溯性。

我知道对于 Swagger,它可以通过 OperationFilter 和自定义标题属性来完成。但是对于直接调用,我只能考虑使用自定义中间件来强制执行此操作。

这是正确的方法还是有其他标准方法来执行它或可用于此目的的标准库?

    标签: asp.net-core .net-core http-headers asp.net-core-webapi


    【解决方案1】:

    这里有一些方法可以做到这一点。没有真正的“标准”方式来做到这一点,但这些方式很常见。

    在您的项目之外

    您可以通过自定义反向代理来强制执行所需的标头。例如,Apigee 允许您自定义其规则,包括强制执行某些 URL 的标头。这很棒,因为它减轻了项目端点的压力和实施。在这些情况下,应将代理配置为返回 400 BAD REQUEST。

    在您的项目中

    在项目代码中,使用 ASP.NET 中间件是大多数项目处理此问题的方式。您可以创建一个中间件来检查标头是否存在,然后在它们缺失时拒绝请求。

    这是一个简单的示例,其中MyHeader 的存在允许调用下一个中间件,但缺少标头会避免调用下一个中间件。

    public class HeaderChecker
    {
        private readonly RequestDelegate _next;
    
        public HeaderChecker(RequestDelegate next) => _next = next;
    
        public async Task Invoke(HttpContext context)
        {
            if (!context.Request.Headers.ContainsKey("MyHeader"))
                context.Response.StatusCode = 400;
            else
                await _next.Invoke(context);
        }
    }
    
    

    使用您将在Startup.cs 中进行的注册

    builder.UseMiddleware<HeaderChecker>();
    

    您可以避免使用中间件,但最终会使控制器的方法变得臃肿,这通常是不受欢迎的。无论哪种方式,SO Q&A 都支持从代码中返回 400 的想法。

    【讨论】:

    • “您可以创建一个中间件来检查标头是否存在,如果它们丢失则拒绝请求。”如何?你能举个例子吗
    • @PatLong-MunkiiYebee 我添加了一个示例。
    猜你喜欢
    • 2018-11-29
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2021-08-27
    • 2020-04-21
    • 1970-01-01
    • 2020-09-01
    相关资源
    最近更新 更多