2017-09-17 6 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です。 機能オン/オフの設定が必要なので、キャッシュメカニズムを無効にしたい場合は、コードを変更する必要はありません。

いくつかのコントローラ/アクションのサブスクリプションを属性に対して「キャンセル」する方法を教えてください。明示的に飾られていますが?

私はwebrole startupで実行するコードを探していますが、機能オン/オフの設定値を指定するとデコレーションをキャンセルします。

ありがとうございました

+0

ミドルウェアをどのようにStartup.csに登録しますか? – Nikolaus

+0

私は 'Startup.cs'に何も登録しません。私はちょうどコントローラ/アクションに属性を入れて、それは魔法のように起こります:) – johni

+0

あなたはそれを使用するかどうかを決めるカスタム属性で属性をラップすることができます。しかし、私はフィルタ属性の専門家ではありません。 – Nikolaus

答えて

1

私はNikolausのアイデアを実装しました。コードは次のようになります。

フィルタと依存性注入を使用する方法
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を見つけることができる属性。

関連する問題