.net - net - Use OutputCache y GetVaryByCustomString para almacenar en caché el mismo contenido para múltiples rutas



outputcache varybyparam (1)

¿Has intentado utilizar: VaryByHeader = "Host"?

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

Más información sobre cómo hacer esto de diferentes maneras que puede encontrar aquí:

Caché de salida para aplicaciones de varios usuarios, que varía según el nombre de host y la cultura

Tengo el siguiente código en mi controlador MVC:

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

Y tengo la siguiente implementación de GetVaryByCustomString en mi clase 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);
        }
    }

En nuestra aplicación, los clientes tendrán su propio subdominio (es decir, johndoe.app.com , janedoe.app.com ).

Por lo tanto, el almacenamiento en caché debe variar en el subdominio.

Sin embargo, cualquier "ruta" en esa URL completamente calificada debería compartir el mismo caché. Por lo tanto, lo siguiente debe leer el mismo caché de salida:

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

Hay una razón de por qué es así, pero en resumen, es una aplicación de SPA, y el "camino" es solo un rastreador. Esto no se puede cambiar a una cadena de consulta.

Cuando la ruta (rastreador) cambia, se accede al método de índice recientemente. Puedo decir esto a través del depurador. Como nota, aún se llama a GetVaryByCustomString , pero se GetVaryByCustomString después de que se procesó el método Index.

¿Cómo puedo variar el caché en función del subdominio, pero usar ese caché independientemente de la ruta (rastreador) en el URL?

Si ofrece algo beneficioso, aquí están mis rutas MVC:

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 versión 5.2.3, .NET 4.6.1





outputcache