سؤال

أنا باستخدام UpdatePanel لبعض عناصر التحكم الخاصة خصيصا ل CAPTCHAS، عندما يتم تنفيذ AsynCpostback الناجمة عن زر "BTNQUERY"، كيف يمكنني أن أقول إلى .ashx (معالج CAPTCHA) لتحديثه الذاتي؟

IM باستخدام جلسة للتحقق من صحة الصورة على 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);
    }
هل كانت مفيدة؟

المحلول

جرب خيارات التخزين المؤقت للمعالجين مثل

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

نصائح أخرى

هل الصورة داخل upderpanel؟ سأضعها هناك إذا لم تكن كذلك. أيضا، في كل مرة تقوم فيها لوحة التحديثات، تأكد من أن عنوان URL لل صورة فريد بحيث لن يستخدم العملاء (المتصفحات) أو الوكلاء صورة مخفأة مؤقتا. يجب على GUID كمعلمة QueryString القيام بالحيلة (مثل YourimageHandler.اشكس؟ XXXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX).

ملاك،

لا يتم طلب الصورة مرة أخرى من الخادم، لذلك لا توجد فرصة لمعالج لتنفيذها. للحصول على ذلك لتنفيذ مرة أخرى، يجب عليك استعادة المتصفح الصورة مرة أخرى.

ومع ذلك، في عونك ASYNC الخاص بك، إذا لم يتم تحديث أي شيء عن الصورة، فلن يكون للمتصفح أي سبب لإحضاره مرة أخرى بغض النظر عن إعدادات ذاكرة التخزين المؤقت، إلخ.

يمكنك حل هذا مع البرنامج النصي، ولكن طريقة أسهل هي أخذ نصيحة ميرا وإلحاق GUID إلى سلسلة الاستعلام من الصورة و تغيير ذلك guid. كجزء من عونك Async الخاص بك. سيقوم هذا بتحديث عنوان URL للصورة المطلوبة على العميل وإجباره على العودة إلى الخادم للحصول على الصورة الجديدة.

إذا لم يحل هذا المشكلة، فيرجى نشر قسم Web.config الذي تطلبه خرائط معالج الصور بالإضافة إلى التعليمات البرمجية التي تستخدمها لإضافة الصورة إلى الصفحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top