2017-05-11 42 views
5

Mam czas tonu próbujący uzyskać instancję obiektu HttpRequestMessage, dzięki czemu mogę przekazać go do metody GetCacheOutputProvider poniżej z ActionFilter i/lub normalnej ASP Kontroler .NET MVC. Wiem, że mogę z Web API, ale co z tymi przypadkami.Pobierz HttpRequestMessage z ActionFilter lub kontrolera sieci Web MVC ASP.NET poza interfejsem API WWW

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

Jakie jest twoje pytanie? – Ashiquzzaman

+0

Przeczytaj tytuł znajomego –

+0

Sprawdź moją odpowiedź. – Ashiquzzaman

Odpowiedz

0

1.In MVC Controller można zrobić tak:

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

2.In filtr działanie można zrobić tak:

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

LUB

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

      base.OnActionExecuting(filterContext); 
     } 
    } 

Mam nadzieję, że to dla ciebie pomoc.

+0

To było puste i NULL, kiedy to zrobiłem. –

+0

Używam mvc5 i .net 4.5. Testuję to. Ma wartość. – Ashiquzzaman

+0

Nie w REGULARNEJ DZIAŁANIU KONTROLERA MVC mój przyjaciel –

0

Nie sądzę, że istnieje prosty sposób. Chcesz instancji klasy HttpRequestMessage, która sematycznie reprezentuje (bieżące) żądanie do WebAPI. Ale nie ma Cię w interfejsie WebAPI i nie obsługujesz żadnych żądań WebAPI. W związku z tym logiczne jest, że nie można łatwo mieć prawidłowego wystąpienia HttpRequestMessage (jeśli mógłbyś, jaki adres URL by wskazywał?). IMHO najbardziej oczywistym sposobem działania jest użycie metody RegisterCacheOutputProvider z CacheOutputConfiguration w celu wstrzyknięcia własnego dostawcy pamięci podręcznej, który zwróci instancję o numerze IApiOutputCache, do której można uzyskać bezpośredni dostęp za pomocą innych środków (takich jak globalnie widoczny singleton). Wygląda na to, że istnieje tylko jedna standardowa implementacja IApiOutputCache: MemoryCacheDefault. Wygląda na to, że jeśli zwrócisz go od zarejestrowanego dostawcy, wszystko będzie w porządku.

Jeśli chcesz być bardziej hacky, wygląda jak wszystkie MemoryCacheDefault przypadki wewnętrznie używać tej samej współdzielonej (statyczny) Pole robić rzeczywistej pracy, więc prawdopodobnie można po prostu stworzyć new MemoryCacheDefault w filtrze lub kontrolera i nadal być OK teraz, ale dla mnie brzmi to dość hacky w porównaniu z alternatywą z pierwszej części mojej odpowiedzi.

Powiązane problemy