2017-05-11 1 views
5

Je suis en train d'essayer d'obtenir une instance d'un HttpRequestMessage afin de pouvoir la passer à la méthode GetCacheOutputProvider ci-dessous depuis un ActionFilter et/ou un ASP normal Contrôleur MVC .NET. Je sais que je peux à partir de l'API Web, mais qu'en est-il de ces instances.Récupère HttpRequestMessage depuis ActionFilter ou ASP.NET MVC Web Controller en dehors de l'API Web

public class CacheResetFilter : ActionFilterAttribute 
    { 
     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      var cache = GlobalConfiguration.Configuration.CacheOutputConfiguration().GetCacheOutputProvider(HTTPREQUESTMESSAGE); 
       cache.Contains("eventid=" + eventId); 

      base.OnActionExecuted(filterContext); 
     } 
+0

Alors, quelle est votre question? – Ashiquzzaman

+0

Lire le titre buddy –

+0

Vérifie ma réponse. – Ashiquzzaman

Répondre

0

1.In un contrôleur MVC, vous pouvez faire comme:

public class HomeController : Controller 
{ 
    public ActionResult Test() 
     { 
      HttpRequestMessage httpRequestMessage = 
       HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage; 
      return View();   
     } 
} 

filtre d'action 2.In vous pouvez faire comme:

public class HttpRequestMessageAttribute : System.Web.Mvc.ActionFilterAttribute 
{ 
    public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) 
    { 
     HttpRequestMessage httpRequestMessage = 
      filterContext.HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage; 
     //var cache = GlobalConfiguration.Configuration.CacheOutputConfiguration().GetCacheOutputProvider(httpRequestMessage); 
     //cache.Contains("eventid=" + eventId); 

     base.OnActionExecuted(filterContext); 
    } 
} 

OU

public class HttpRequestMessageAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpRequestMessage httpRequestMessage = 
       filterContext.HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage; 

      base.OnActionExecuting(filterContext); 
     } 
    } 

J'espère que c'est de l'aide pour vous.

+0

Il était vide et NULL quand je l'ai fait. –

+0

J'utilise mvc5 et .net 4.5. Je l'ai testé. Il a de la valeur. – Ashiquzzaman

+0

Pas dans l'ACTION DU CONTRÔLEUR MVC RÉGULIER mon ami –

0

Je ne pense pas qu'il y ait un moyen simple. Vous voulez une instance de classe HttpRequestMessage qui représente de manière sémantique une requête (en cours) à WebAPI. Mais vous n'êtes pas dans WebAPI et ne gérez aucune requête WebAPI. Il est donc logique que vous ne puissiez pas avoir une instance valide de HttpRequestMessage (si vous le pouvez, à quelle URL pointe-t-elle?). IMHO le moyen le plus évident de contourner ce problème est d'utiliser la méthode RegisterCacheOutputProvider de CacheOutputConfiguration pour injecter votre propre fournisseur de cache qui renverrait une instance de IApiOutputCache à laquelle vous pouvez accéder directement en utilisant d'autres moyens (tels que singleton globalement visible). Il semble qu'il n'y ait qu'une seule implémentation standard de IApiOutputCache: MemoryCacheDefault. Il semble donc que si vous le renvoyez de votre fournisseur enregistré, vous serez OK. Si vous voulez être plus hacky, il semble que toutes les instances MemoryCacheDefault utilisent en interne le même champ partagé (statique) pour faire le travail réel. Vous pouvez donc probablement créer new MemoryCacheDefault dans votre filtre ou votre contrôleur et être toujours OK pour maintenant, mais pour moi, cela ressemble à un hacky comparé à l'alternative de la première partie de ma réponse.