Domanda

Im usando UpdatePanel per alcuni controlli specialmente per captcha così, quando viene eseguito un AsyncPostBack innescato da un pulsante "btnQuery", come posso dire al Ashx (Handler per Captcha) per aggiornare è di per sé?

Im usando sessione per convalidare l'immagine sul Captcha al Num sull'ingresso sotto l'immagine

Questo è il 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; } }
}

Voglio aggiornare l'immagine .. non solo fare questo:

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

Soluzione

Prova opzioni di cache per i gestori come

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

Se di cui sopra non funziona unica idea che mi rimane sta chiamando gestore con queryString in modo che fonte immagine non è stesso ogni volta che si chiama
          Image1.ImageUrl = "Handler.aspx?guid=" + Guid.NewGuid();

Altri suggerimenti

E 'l'immagine all'interno della UpdatePanel? Avevo messo lì se non lo è. Inoltre, ogni volta che gli aggiornamenti del pannello, verificare che l'URL per l'immagine unica modo che i client (browser) o proxy non utilizzare un'immagine memorizzata nella cache. Un Guid appiccicato come un parametro querystring dovrebbe fare il trucco (per esempio YourImageHandler.ashx? Xxxxxxxxxxxx-xxxxxxxx-xxxxxxxxxxxx).

Angelo,

L'immagine non viene richiesto di nuovo dal server, quindi non c'è alcuna possibilità per il gestore da eseguire. Per ottenere che per eseguire di nuovo, è necessario rendere il browser recuperare nuovamente l'immagine.

Detto questo, nel vostro postback asincrono, se nulla circa l'immagine viene aggiornata, il browser non avrà alcun motivo per andare a prendere di nuovo indipendentemente dalle impostazioni della cache, ecc.

Si potrebbe risolvere questo con lo script, ma un modo più semplice è quello di seguire il consiglio di Myra e aggiungere un GUID alla stringa di query dell'immagine e cambiamento che GUID come parte della vostra postback asincrono. Questo aggiornerà URL dell'immagine necessaria sul client e costringerlo a tornare al server per ottenere la nuova immagine.

Se questo non risolve il problema, si prega di inviare la sezione del web.config che mappa le richieste al gestore di immagine così come il codice che si utilizza per aggiungere l'immagine alla pagina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top