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
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? –
@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
Co powiesz na umieszczenie go w konstruktorze kontrolera? Proszę, podziel się także swoją odpowiedzią, jestem teraz nieco ciekawy. –