Pergunta

Im usando UpdatePanel para alguns controles especialmente para captchas por isso, quando um AsyncPostBack é realizada acionado por um botão "btnQuery", Como posso dizer ao .ashx (Handler para Captcha) para atualizar a si próprio?

Im usando sessão para validar a imagem na Captcha para o Num na entrada abaixo da imagem

Esta é a Handler:

<%@ 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; } }
}

Eu quero atualizar a imagem .. não apenas fazer isso:

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

Solução

Tente cache opções para manipuladores como

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

Se acima não funciona apenas ideia que resta está chamando manipulador com queryString para que fonte de imagem não é mesmo qualquer momento que você chamar
Image1.ImageUrl = "Handler.aspx?guid=" + Guid.NewGuid();

Outras dicas

É a imagem dentro do UpdatePanel? Eu colocá-lo lá se não é. Além disso, cada vez que as atualizações do painel, verifique se a URL para a imagem tão única que os clientes (navegadores) ou proxies não vai usar uma imagem armazenada em cache. A Guid pregado como um parâmetro querystring deve fazer o truque (por exemplo YourImageHandler.ashx? Xxxxxxxxxxxx-xxxxxxxx-xxxxxxxxxxxx).

Angel,

A imagem não está sendo solicitado novamente do servidor, portanto, não há oportunidade para o identificador a ser executada. Para obter esse para executar novamente, você deve fazer o navegador recuperar a imagem novamente.

Dito isso, em sua postagem assíncrona, se nada sobre a imagem é atualizada, o navegador não terá nenhuma razão para buscá-la novamente independentemente das configurações de cache, etc.

Você poderia resolver isso com script, mas uma maneira mais fácil é tomar o conselho de Myra e acrescentar um GUID para a string de consulta da imagem e mudança que GUID como parte de seu postback assíncrono. Isto irá atualizar URL da imagem necessária no cliente e forçá-lo a voltar para o servidor para obter a nova imagem.

Se isto não resolver o problema, por favor poste na seção de sua web.config que mapeia solicitações para o manipulador de imagem, bem como o código que você usa para adicionar a imagem à página.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top