如何在ActionFilterAttribute

时间:2016-06-01 17:56:28

标签: asp.net-core asp.net-core-mvc

我有一个继承ActionFilterAttribute的课程。

它解密了调用者加密的Request中的一些查询字符串属性。这可以确保我的WebAPI方法只接收“好”参数。这很有效。

如果参数未加密,我需要做的并且没有成功的是否定/失败上下文(请求)。

如何强制终止请求? 我正在做我的逻辑:

public override void OnActionExecuting(ActionExecutingContext context)

已经尝试将响应设置为401,但这不起作用:

//Negate the access by default
 context.HttpContext.Response.StatusCode = 401;

2 个答案:

答案 0 :(得分:5)

  1. 正如Clint B所说,其中一种方法是使用中间件。 Here是关于中间件的ASP核心文档,其中包含操作示例

  2. 另一方面,如果您使用MVC并希望使用ActionFilter强制停止MVC操作,则可以通过将Action Context .Result属性设置为非空值来执行此操作。

  3. 示例:

    actionContext.HttpContext.Response.StatusCode = 401;
    actionContext.HttpContext.Response.Headers.Clear();
    
    actionContext.Result = new EmptyResult();
    //var wrongResult = new { error = "Wrong parameters"};
    //actionContext.Result = new JsonResult(wrongResult);
    
      

    如何在Middleware和Action过滤器之间进行选择?操作过滤器可用作方法过滤器,控制器过滤器或全局过滤器仅用于MVC HTTP请求。

         

    中间件是“坐在”HTTP管道上的组件,用于检查所有请求和响应

    1. 对于请求参数验证,您可以使用Data Annotations

答案 1 :(得分:1)

在ASP.NET Core中执行此操作的方法是编写自定义中间件。只是在请求期间设置响应状态代码将不起作用。因为当请求到达生成响应的中间件时,状态代码将被覆盖。

如果您在中间件中执行此操作,则可以在此处停止请求并发回401响应。

编辑:
我在GitHub上发布了一个教程项目,演示了如何通过三个简单的步骤创建具有依赖注入的自定义中间件。我还没有将它转换为RC2,但你不必运行它来学习如何做到这一点。这很简单。阅读自述文件,它解释了如何搜索相关区域的代码。您可以下载项目here