1

キャプチャ専用のいくつかのコントロールに UpdatePanel を使用しているため、ボタン「btnQuery」によってトリガーされて AsyncPostBack が実行された場合、.ashx (キャプチャのハンドラー) にそれを更新するように指示するにはどうすればよいですか?

セッションを使用して、Captcha の画像を画像の下の入力の Num に検証します

これはハンドラです:

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

3 に答える 3

2

次のようなハンドラのキャッシュ オプションを試してください。

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();

于 2009-08-13T22:44:48.910 に答える
1

画像は UpdatePanel 内にありますか? なければ入れます。また、パネルが更新されるたびに、画像の URL が一意であることを確認して、クライアント (ブラウザ) またはプロキシがキャッシュされた画像を使用しないようにします。クエリ文字列パラメーターとして追加された Guid は、トリックを実行する必要があります (例: YourImageHandler.ashx?xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

于 2009-08-12T16:18:57.737 に答える
1

天使、

イメージはサーバーから再度要求されていないため、ハンドラーを実行する機会はありません。それを再度実行するには、ブラウザに画像を再度取得させる必要があります。

つまり、非同期ポストバックでは、画像について何も更新されていない場合、ブラウザはキャッシュ設定などに関係なく、画像を再度取得する理由がありません.

これはスクリプトで解決できますが、より簡単な方法は、Myra のアドバイスに従って、イメージのクエリ文字列に GUID を追加し、その GUIDを非同期ポストバックの一部として変更することです。これにより、クライアントで必要な画像の URL が更新され、強制的にサーバーに戻って新しい画像を取得します。

これで問題が解決しない場合は、リクエストを画像ハンドラーにマップする web.config のセクションと、画像をページに追加するために使用するコードを投稿してください。

于 2009-08-16T17:25:05.957 に答える