在 .Net Core WebAPI 上强制执行强制请求标头?

问题描述 投票:0回答:1

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

我知道对于 Swagger,可以通过

OperationFilter
和自定义标头属性来完成。但对于直接调用,我可以想到仅使用自定义中间件来强制执行此操作。

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

asp.net-core .net-core http-headers asp.net-core-webapi
1个回答
1
投票

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

旁白:Swagger/OpenAPI 不会改变 API 的运行方式。也不应该。这些是文档和发现工具。

在您的项目之外

您可以通过自定义反向代理来强制执行所需的标头。例如,Apigee 允许您自定义其规则,包括强制执行某些网址的标头。这很棒,因为它减轻了项目端点的压力和实施。在这些情况下,代理应配置为返回 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 的想法。

在您的项目中,使用 [FromHeader]

您可以使用 [FromHeader] 属性,这可能是最简单的可行方法,尽管这确实意味着您必须将标头绑定到模型。如果您的目的只是确保标头存在,而不以任何方式与您的模型相关,那么这可能是不可取的。

一如既往,在开发过程中,这取决于情况。

© www.soinside.com 2019 - 2024. All rights reserved.