2017-09-17 1 views
0

J'ai un middleware ASP.NET sous la forme ActionFilterAttribute.Ignorer ActionFilterAttribute, bien que défini explicitement sur le contrôleur/l'action

Par exemple:

[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}); 
} 

L'attribut CacheResponse est un NuGet, je ne peux pas toucher son code. Pourtant, je voudrais avoir une fonctionnalité de configuration on/off, donc si je veux désactiver le mécanisme de cache, je n'aurai pas à faire des changements dans le code. Comment puis-je "annuler" l'abonnement de certains contrôleurs/actions à des attributs? même si c'est explicitement décoré avec?

Je cherche un morceau de code à lancer au démarrage de webrole, cela étant donné que la valeur de configuration pour le feature-on/off annulerait la décoration.

Merci

+0

Comment enregistrer le middleware dans Startup.cs? – Nikolaus

+0

Je n'enregistre rien dans 'Startup.cs'. Je viens de mettre un attribut sur le Controller/Action et cela arrive comme par magie :) – johni

+0

Vous pouvez envelopper l'attribut avec votre attribut personnalisé, où vous décidez si vous l'utilisez ou non. Mais je ne suis pas un expert avec des attributs de filtre. – Nikolaus

Répondre

1

J'ai mis en œuvre l'idée de Nikolaus. Code pourrait ressembler à:

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; 
    } 
} 

Comment utiliser l'injection de dépendance avec filtre attribut, vous pouvez trouver here.