Controller与action方法的ActionFilterAttribute

时间:2017-12-15 05:56:06

标签: c# asp.net asp.net-web-api action-filter actionfilterattribute

我有一个LoggingAttribute,用OnActionExecuted方法记录请求和响应:

public class LoggingAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext httpContext)
    {
            //Logger.Log();
    }
}

还有另一个属性可用于验证请求并返回BadRequest。来自OnActionExecuting方法的返回响应:

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;
        if (!modelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
    }
}

现在,当我在Action方法上同时应用这两个属性时,我的BadRequest未被记录,但是当我在控制器级别应用LoggingAttribute并且在动作方法上应用ValidateModelAttribute时,{{ 1}}被记录(BadRequestOnActionExecuted被调用。

有人可以解释这种行为,即使在控制器上应用属性时没有执行操作方法时,LoggingAttribute也会被调用。

2 个答案:

答案 0 :(得分:2)

您需要首先在行动方法

上应用LoggingAttribute
       [LoggingAttribute]
        [ValidateModelAttribute]        
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

答案 1 :(得分:1)

我尝试过你最喜欢的场景

[HttpGet]
[ValidateModelAttribute]
[LoggingAttribute]
public void test()
{
   //throw new NotImplementedException("This method is not implemented");
}

使用与您相同的代码,我发现与您相同的问题,您的LogginAttribute未被调用,因为您正在为ValidateModelAttribute中的上下文设置repose,因为请求获得响应它会立即返回(因为这个actionContext.Response =)当请求得到响应时,它甚至不会调用你应用属性的方法。

此部分的解决方案是您必须编写OnActionExecuting,然后在Validationattribute OnActionExecuting方法之前调用OnActionExecuting,并且您的代码将在LoggingAttribute之前以public class LoggingAttribute : ActionFilterAttribute { public override void OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext) { //Logger.Log(); } public override void OnActionExecuted(HttpActionExecutedContext httpContext) { //Logger.Log(); } } 方式记录正在回复。

Response

以及更改顺序或属性,下面的原因是设置[HttpGet] [LoggingAttribute] [ValidateModelAttribute] public void test() { //throw new NotImplementedException("This method is not implemented"); } 时,那么在这种情况下它只从那个点返回,所以管道中的任何过滤器都不是被叫。

from keras.preprocessing.image import ImageDataGenerator
dataset=ImageDataGenerator()
dataset.flow_from_directory('/home/1',target_size=(50,50),save_to_dir='/home/resized',class_mode='binary',save_prefix='N',save_format='jpeg',batch_size=10)

如下面@programtreasures的回答

所示