当前位置:  开发笔记 > 编程语言 > 正文

在ASP.net核心中创建自定义验证属性

如何解决《在ASP.net核心中创建自定义验证属性》经验,为你挑选了1个好方法。

我想使用属性来确保我的请求中存在某些标头.这不是授权属性.其中一个用例是收到请求时,我想确保老客户端有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之后和模型绑定之前 - 这对你的场景有意义).

但根据您的需要,您应该使用适当的过滤器.



1> erikbozic..:

您可以使用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之后和模型绑定之前 - 这对你的场景有意义).

但根据您的需要,您应该使用适当的过滤器.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有