Pregunta

Im usando UpdatePanel para algunos controles especialmente para los captchas así, cuando se realiza una AsyncPostBack activa mediante un botón "btnQuery", ¿Cómo puedo saber a la .ashx (Manejador de Captcha) para actualizarlo auto?

Im usando sesión para validar la Imagen Captcha en el Num en la entrada debajo de la imagen

Este es el controlador:

<%@ WebHandler Language="C#" Class="captcha" %>
using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;

public class captcha : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/GIF";

        Bitmap imagen_GIF = new System.Drawing.Bitmap(80, 30);
        Graphics grafico = System.Drawing.Graphics.FromImage(imagen_GIF);
        grafico.Clear(Color.Gainsboro);

        Font tipo_fuente = new Font("Comic Sans", 12, FontStyle.Bold);

        string randomNum = string.Empty;
        Random autoRand = new Random();

        for (int x = 0; x < 5; x++)
        {
            randomNum += System.Convert.ToInt32(autoRand.Next(0, 9)).ToString();
        }
        int i_letra = System.Convert.ToInt32(autoRand.Next(65, 90));

        string letra = ((char)i_letra).ToString();
        randomNum += letra;

        context.Session["RandomNumero"] = randomNum;

        grafico.DrawString(randomNum, tipo_fuente, Brushes.Black, 5, 5);

        imagen_GIF.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);

        tipo_fuente.Dispose();
        grafico.Dispose();
        imagen_GIF.Dispose();
    }

    public bool IsReusable { get { return false; } }
}

Quiero actualizar la imagen .. no sólo hacer esto:

   public void postbackear()
    {
        string script = string.Format("Sys.WebForms.PageRequestManager.getInstance()._doPostBack('{0}', '');",
                            btnConsulta.ID);
        ScriptManager.RegisterStartupScript(this.Page, typeof(string), "Refresh", script, true);
    }
¿Fue útil?

Solución

Trate de opciones de almacenamiento en caché para los manipuladores como

context.Response.Cache.SetExpires(DateTime.Now); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetValidUntilExpires(false);

Si arriba no funciona única idea que me queda es llamar manejador con queryString fuente de modo que la imagen no es la misma cada vez que llama
          Image1.ImageUrl = "Handler.aspx?guid=" + Guid.NewGuid();

Otros consejos

Es la imagen dentro del UpdatePanel? Me puse ahí si no lo es. Además, cada vez que las actualizaciones del panel, asegúrese de que la dirección URL de la imagen única para que los clientes (navegadores) o proxies no utilizarán una imagen almacenada en caché. A Guid insertan en como un parámetro de cadena de consulta debe hacer el truco (por ejemplo YourImageHandler.ashx? Xxxxxxxxxxxx-xxxxxxxx-xxxxxxxxxxxx).

Ángel,

La imagen no se solicita de nuevo desde el servidor, por lo que no hay oportunidad para el manejador de ejecutar. Para conseguir que ejecutar de nuevo, debe hacer que el navegador recuperar la imagen de nuevo.

Dicho esto, en su devolución de datos asincrónica, si nada acerca de la imagen se actualiza, el navegador tendrá ninguna razón para traerlo de nuevo, independientemente de la configuración de caché, etc.

Usted podría resolver esto con guión, pero una manera más fácil es tomar el consejo de Myra y anexar un GUID a la cadena de consulta de la imagen y cambio que GUID como parte de su devolución de datos asincrónica. Esto actualizará el URL de la imagen necesaria en el cliente y obligarlo a volver al servidor para obtener la nueva imagen.

Si esto no resuelve el problema, por favor, puesto la sección de su web.config que asigna las peticiones al controlador de imagen, así como el código que se utiliza para agregar la imagen a la página.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top