Usando ASP.NET AJAX UpdatePanel com manipuladores
-
11-09-2019 - |
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);
}
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.