2017-09-17 4 views
0

ActionFilterAttribute 형태의 ASP.NET 미들웨어가 있습니다. 예를 들어컨트롤러/액션에 명시 적으로 정의되어 있지만 ActionFilterAttribute 무시.

:

[CacheResponse(Seconds = 3)] 
public async Task<IHttpActionResult> Echo(string userId, string message, string queryString) 
{ 
    await Task.Delay(150); 
    return Ok(new {Action = "Echo", UserId = userId, Message = message, QueryString = queryString}); 
} 

속성 CacheResponse는 nuget이고, 나는 그것의 코드를 만지지 수 있습니다. 그러나 feature-on/off 구성을 원합니다. 따라서 캐시 메커니즘을 비활성화하려면 코드에서 변경하지 않아도됩니다.

속성에 대한 일부 컨트롤러/작업의 구독을 "취소"할 수 있습니까? 비록 명시 적으로 그것으로 장식되어 있더라도?

필자는 webrole startup에서 실행할 코드를 찾고 있는데, feature-on/off에 대한 구성 값이 있으면 장식을 취소 할 것입니다.

+0

어떻게 미들웨어를 Startup.cs에 등록합니까? – Nikolaus

+0

'Startup.cs'에 아무것도 등록하지 않았습니다. 난 그냥 컨트롤러/액션에 속성을 넣고 마술처럼 생깁니다. – johni

+0

당신이 사용 여부를 결정하는 사용자 정의 속성으로 속성을 래핑 할 수 있습니다. 하지만 필자는 필터 속성에 익숙하지 않습니다. – Nikolaus

답변

1

내가 니콜라우스의 아이디어를 구현 한 감사합니다.

public class ConfigurableCacheResponseAttribute : CacheResponseAttribute 
{ 
    //Property injection 
    public IApplicationConfig ApplicationConfig { get; set; } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     if (this.ApplicationConfig.Get<bool>("CashingEnabled")) 
     { 
      base.OnActionExecuted(actionExecutedContext); 
     } 
    } 

    public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) 
    { 
     if (this.ApplicationConfig.Get<bool>("CashingEnabled")) 
     { 
      return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken); 
     } 

     return Task.CompletedTask; 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (this.ApplicationConfig.Get<bool>("CashingEnabled")) 
     { 
      base.OnActionExecuting(actionContext); 
     } 
    } 

    public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     if (this.ApplicationConfig.Get<bool>("CashingEnabled")) 
     { 
      return base.OnActionExecutingAsync(actionContext, cancellationToken); 
     } 

     return Task.CompletedTask; 
    } 
} 

가 어떻게 here을 찾을 수있는 속성 필터 의존성 주입을 사용하려면 다음과 같은 코드가 보일 수 있습니다.