我当前正在尝试在 API 进入控制器之前访问传入请求的标头,并且我想检查它是否包含特定标头。我一直在寻找一种方法来实现中间件或类似的东西,但我还没有找到任何使用 .net 框架为 Web API 实现的好方法,我只找到了 .NET Core 的解决方案。 另外,我希望对我的所有控制器进行全局设置,以避免在我的控制器的每个方法中添加类似的内容:
(!Request.Headers.Contains(requiredHeader))
return StatusCode(HttpStatusCode.PreconditionFailed);
像这样使用
DelegatingHandler
:
public class MyCustomHeaderHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// Check if the request contains the required header
if (!request.Headers.Contains("requiredHeader"))
{
return request.CreateResponse(HttpStatusCode.PreconditionFailed);
}
// else, pass the request to the next handler in the pipeline
return await base.SendAsync(request, cancellationToken);
}
}
并在其他人之前将其注册到管道中:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new MyCustomHeaderHandler());
// Other configurations ....
}
}
也许您可以为所有控制器使用从 Controller 派生的基类,并添加和重写 OnActionExecuting。