强制请求头在.net Core WebAPI?



是否有一种标准的方法来强制执行。net核心Web api的强制请求头?我希望所有调用者应用程序通过一些跟踪头,以便我有一些呼叫量的可追溯性。

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

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

这里有一些方法可以做到这一点。并没有真正的"标准"。方法,但这些方法是很常见的。

项目外部

您可以通过自定义反向代理来强制执行所需的标头。例如,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>();

你可以避免中间件,但是你最终会膨胀你的控制器的方法,这通常是不赞成的。无论哪种方式,这个问题都支持从代码中返回400的想法。

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

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

一如既往,在开发中,这取决于。

最新更新