我想使用属性来确保我的请求中存在某些标头.这不是授权属性.其中一个用例是收到请求时,我想确保老客户端有X-Request-For标头,可以正确处理.还有其他用例,但是所有这些用例都会在控制器收取费用之前读取特定的http标头值并采取适当的操作.
[MyAttribute(HeaderOptions.RequestFor) [httpPost] public MyMethod(string data) { ... }
erikbozic.. 5
您可以使用MVC过滤器创建此类属性.
例如,创建一个这样的过滤器:
public class CheckHeaderFilter : Attribute, IResourceFilter { private readonly string[] _headers; public CheckHeaderFilter(params string[] headers) { _headers = headers; } public void OnResourceExecuting(ResourceExecutingContext context) { if (_headers == null) return; if (!_headers.All(h => context.HttpContext.Request.Headers.ContainsKey(h))) { //do whatever you need to do when check fails throw new Exception("Necessary HTTP headers not present!"); } } public void OnResourceExecuted(ResourceExecutedContext context) { } }
然后在动作(或控制器)上使用它:
[CheckHeaderFilter(HeaderOptions.RequestFor)] public IActionResult Index() { ... }
我强烈建议您仔细阅读文档,以便了解要使用哪种类型的过滤器.在这个例子中,我使用了ResourceFilter,因为它在管道中相当早(在auth之后和模型绑定之前 - 这对你的场景有意义).
但根据您的需要,您应该使用适当的过滤器.
您可以使用MVC过滤器创建此类属性.
例如,创建一个这样的过滤器:
public class CheckHeaderFilter : Attribute, IResourceFilter { private readonly string[] _headers; public CheckHeaderFilter(params string[] headers) { _headers = headers; } public void OnResourceExecuting(ResourceExecutingContext context) { if (_headers == null) return; if (!_headers.All(h => context.HttpContext.Request.Headers.ContainsKey(h))) { //do whatever you need to do when check fails throw new Exception("Necessary HTTP headers not present!"); } } public void OnResourceExecuted(ResourceExecutedContext context) { } }
然后在动作(或控制器)上使用它:
[CheckHeaderFilter(HeaderOptions.RequestFor)] public IActionResult Index() { ... }
我强烈建议您仔细阅读文档,以便了解要使用哪种类型的过滤器.在这个例子中,我使用了ResourceFilter,因为它在管道中相当早(在auth之后和模型绑定之前 - 这对你的场景有意义).
但根据您的需要,您应该使用适当的过滤器.