是否有标准方法在 .Net Core Web API 中强制执行强制请求标头?我希望所有呼叫者应用程序都传递一些跟踪标头,以便我对呼叫量有一定的可追溯性。
我知道对于 Swagger,可以通过
OperationFilter
和自定义标头属性来完成。但对于直接调用,我可以想到仅使用自定义中间件来强制执行此操作。
这是正确的方法吗?或者是否有其他标准方法来强制执行它或可用于此目的的标准库?
这里有几种方法可以做到这一点。并没有真正的“标准”方法来做到这一点,但这些方法很常见。
旁白: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] 属性,这可能是最简单的可行方法,尽管这确实意味着您必须将标头绑定到模型。如果您的目的只是确保标头存在,而不以任何方式与您的模型相关,那么这可能是不可取的。
一如既往,在开发过程中,这取决于情况。