2017-07-11 67 views
10

Mam następujący kod w moim kontrolera MVC:Zastosowanie OutputCache i GetVaryByCustomString buforować tej samej treści do wielu ścieżek

[HttpGet] 
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "app")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

I mam następujące realizacja GetVaryByCustomString w mojej klasie Global.asax.cs:

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
     switch (arg.ToLower()) 
     { 
      case "app": 
       return context.Request.Url.Host; 

      default: 
       return base.GetVaryByCustomString(context, arg); 
     } 
    } 

W naszej aplikacji, klienci będą mieli własną subdomenę (tj johndoe.app.com, janedoe.app.com).

Tak więc buforowanie powinno się różnić w poddomenie.

Jednak każda "ścieżka" do tego w pełni kwalifikowanego adresu URL powinna mieć tę samą pamięć podręczną. Więc następujące powinien przeczytać ten sam bufor wyjściowy:

  • johndoe.app.com/
  • johndoe.app.com/123
  • johndoe.app.com/abc

Jest takie wyczerpujący powód, dlaczego tak właśnie jest, ale krótko mówiąc, jest to aplikacja SPA, a "ścieżka" jest po prostu trackerem. Nie można tego zmienić na ciąg zapytania.

Gdy zmienia się ścieżka (śledzenie), metoda indeksu jest świeżo dostępna. Mogę to powiedzieć poprzez debugger. Jako uwaga, wciąż jest wywoływana GetVaryByCustomString, ale jest wywoływana po przetworzeniu metody Index.

Jak mogę zmieniać pamięć podręczną na podstawie poddomeny, ale używam tej pamięci podręcznej bez względu na ścieżkę (śledzenie) pod adresem URL?

czy oferuje coś benefical, oto moje MVC trasy:

routes.MapRoute(
      name: "Tracker", 
      url: "{r}", 
      defaults: new { controller = "Home", action = "Index", id = "" }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

MVC wersja 5.2.3, NET 4.6.1

+0

Nie jestem pewien, czy ta praca, ale nie można wdrożyć GetVaryByCustomString jako filtr niestandardowy, jeśli chcesz być wykonane przed działaniem indeksowym? –

+0

@RAHULSR Nie sądzę. Musisz go przesłonić w pliku Global.asax.cs. Mogłabym zaimplementować niestandardowe rozwiązanie do buforowania, obejmujące filtry akcji lub globalne przeglądarki internetowe lub coś podobnego, ale to nie byłoby idealne. – contactmatt

+0

Co powiesz na umieszczenie go w konstruktorze kontrolera? Proszę, podziel się także swoją odpowiedzią, jestem teraz nieco ciekawy. –

Odpowiedz

1

próbowałeś użyć: VaryByHeader = "Host" ?

[HttpGet] 
[OutputCache(Duration = 3600, VaryByHeader = "Host")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

Więcej informacji, jak to zrobić na różne sposoby można znaleźć tutaj:

Output cache for multi-tenant application, varying by hostname and culture

+0

Zmienianie przez hosta jest dobre dla różnych subdomen i tym podobnych. Ale to jest ta sama domena, protokół itp., Tylko wariancja ścieżek. – contactmatt

+0

Nie osiąga się tego, ponieważ wszystko, co inne subdomeny, jest kontrolowane przez kontrolery aplikacji SPA. Jeśli po subdomenie zostały zapisane elementy z pamięci podręcznej, oznaczałoby to, że nie można kontrolować adresu URL z aplikacji SPA. –

+0

@contactmatt Znalazłem takie rozwiązanie: https://techblog.dorogin.com/using-html5-appcache-with-single-page-applications-dc64f81e6b7e. Czy możesz wysłać opinię? –