Вопрос

Я использую UpdatePanel для некоторых элементов управления, специально для капч, поэтому, когда AsyncPostBack выполняется с помощью кнопки «btnQuery», как я могу сказать .ashx (обработчику для капчи) обновить его самостоятельно?

Я использую сеанс для проверки изображения в капче на число на входе под изображением.

это обработчик:

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

хочу обновить картинку..не просто так делаю:

   public void postbackear()
    {
        string script = string.Format("Sys.WebForms.PageRequestManager.getInstance()._doPostBack('{0}', '');",
                            btnConsulta.ID);
        ScriptManager.RegisterStartupScript(this.Page, typeof(string), "Refresh", script, true);
    }
Это было полезно?

Решение

Попробуйте варианты кэширования для обработчиков, например

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

Если вышеизложенное не работает, единственная идея, которая у меня осталась, - это вызов обработчика с помощью queryString, чтобы источник изображения не был одинаковым каждый раз, когда вы вызываете
Image1.ImageUrl = "Handler.aspx?guid=" + Guid.NewGuid();

Другие советы

Находится ли изображение внутри UpdatePanel?Я бы поставил его туда, если это не так.Кроме того, каждый раз при обновлении панели убедитесь, что URL-адрес изображения уникален, чтобы клиенты (браузеры) или прокси-серверы не использовали кэшированное изображение.Guid, добавленный в качестве параметра строки запроса, должен помочь (например,YourImageHandler.ashx?xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Ангел,

Изображение не запрашивается повторно с сервера, поэтому у обработчика нет возможности выполнить его.Чтобы это выполнить снова, вы должны заставить браузер снова получить изображение.

Тем не менее, если в вашей асинхронной обратной передаче ничего не обновляется, у браузера не будет причин снова получать его, независимо от настроек кеша и т. д.

Вы можете решить эту проблему с помощью сценария, но более простой способ — последовать совету Майры и добавить GUID к строке запроса изображения и измените этот GUID как часть вашей асинхронной обратной передачи.Это обновит URL-адрес изображения, необходимого на клиенте, и заставит его вернуться на сервер для получения нового изображения.

Если это не решит проблему, опубликуйте раздел вашего web.config, который сопоставляет запросы с обработчиком изображения, а также код, который вы используете для добавления изображения на страницу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top