none
Caché de imagen RRS feed

  • Pregunta

  • Buen día!!

    Tengo una vista parcial en donde se carga una imagen a través de un input file; ésta vista parcial está contenida dentro de un "wizard" por lo que puedo avanzar o retroceder entre vistas parciales. Precisamente cuando regreso a la vista en donde se carga la imagen me muestra el archivo que ya he cargado, y la posibilidad de elegir otra imagen y reemplazarla, por lo que el archivo se renombra. El punto es que si decido regresar a la vista parcial, la imagen que muestra corresponde a la primera que cargué y no su reemplazo. Qué puede estar pasando? 

    En los controladores estoy utilizando  [OutputCache(Duration = 0)] para hacer que no guarde caché, al parecer afecta al css, javascript y elementos input, pero no a las imágenes. Lo mismo con los metas :

    <meta http-equiv="expires" content="0">
            <meta http-equiv="Cache-Control" content="no-cache">
            <meta http-equiv="Pragma" content="no-cache">

    Existe alguna otra forma que pueda implementar para solucionar éste problema? (Espero haber sido clara en la explicación)

    Gracias!!


    AUR



    • Editado Ale Uribe miércoles, 7 de octubre de 2015 14:27 Tabulación
    miércoles, 7 de octubre de 2015 14:26

Respuestas

  • Si precisamente eso era lo que yo decía, que le descativaras el caché en el método que procese la imagen que se devuelve al src del img (NO en el html). Si el src apunta a un jpg estático en lugar de a un método, hay un truco que consiste en apuntar el src a un método de acción que por dentro primero desactive el caché y luego haga un "return File(...)" devolviendo el contenido del archivo estático que contiene la imagen. Esto es mejor que lo de poner cada vez un valor en p, porque esto último "poluciona" el caché del navegador haciendo que se guarden todas las imágenes con todos los valores de p.

    • Marcado como respuesta Ale Uribe miércoles, 7 de octubre de 2015 21:44
    miércoles, 7 de octubre de 2015 16:42

Todas las respuestas

  • [...] estoy utilizando  [OutputCache(Duration = 0)]

    Estás en un error. Eso solo afecta al caché de salida del método de acción en el lado servidor, pero no impide que los resultados de las peticiones GET se cacheen en el navegador o en cualquier proxy intermedio. Puedes probar con cualquiera de estas instrucciones:

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();

    Nótese que esto solo afectará al resultado del método de acción que contiene esas instrucciones, es decir, que donde debes meterlo no es en el método que devuelve la vista que contiene la imagen, sino en el método de acción al que apunta el src de la imagen.

    miércoles, 7 de octubre de 2015 14:51
  • Gracias por esponder!

    Desde donde estoy referenciando la imagen, no es propiamente una acción. Va directo en el html, dado que el nombre siempre es el mismo. Es decir, es el atributo src de un elemento <img>.

    Por ahora pude solucionarlo agregando a la url de la imagen un parámetro "p" cuyo valor equivale a DateTime.Now.Ticks.ToString().


    AUR

    miércoles, 7 de octubre de 2015 15:39
  • Si precisamente eso era lo que yo decía, que le descativaras el caché en el método que procese la imagen que se devuelve al src del img (NO en el html). Si el src apunta a un jpg estático en lugar de a un método, hay un truco que consiste en apuntar el src a un método de acción que por dentro primero desactive el caché y luego haga un "return File(...)" devolviendo el contenido del archivo estático que contiene la imagen. Esto es mejor que lo de poner cada vez un valor en p, porque esto último "poluciona" el caché del navegador haciendo que se guarden todas las imágenes con todos los valores de p.

    • Marcado como respuesta Ale Uribe miércoles, 7 de octubre de 2015 21:44
    miércoles, 7 de octubre de 2015 16:42
  • Gracias!! Eso fue lo que funcionó !!

    En el html apunté a la acción:

    <img style=" width: 100%;" src="@Url.Action("obtenerImg", "CargaImg", new { r = "~/Img/img_x2" })" />


    Y en el Controlador cree la acción:

    public FilePathResult obtenerImg(string r) {
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.Cache.SetNoStore();
    
                return File(r, "image/*");
            }



    AUR

    miércoles, 7 de octubre de 2015 21:44