2

captcha.ashx ページが要求されるたびに、ユーザーに Captcha イメージを生成する HTTPHandler があります。そのためのコードは簡単です:

        CaptchaHandler handler = new CaptchaHandler();
        Random random = new Random();
        string[] fonts = new string[4] { "Arial", "Verdana", "Georgia", "Century Schoolbook" };
        string code = Guid.NewGuid().ToString().Substring(0, 5);
        context.Session.Add("Captcha", code);

        Bitmap imageFile = handler.GenerateImage(code, 100, 70, fonts[random.Next(0,4)]);
        MemoryStream ms = new MemoryStream();
        imageFile.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

        byte[] buffer = ms.ToArray();

        context.Response.ClearContent();
        context.Response.ContentType = "image/png";
        context.Response.BinaryWrite(buffer);
        context.Response.Flush();

次に、通常のWebサイトで、次の情報を取得しました。

...
<img id="securityCode" src="captcha.ashx" alt="" /><br />
<a href="javascript:void(0);" onclick="javascript:refreshCode();">Refresh</a>
...

これは完全に機能し、画像が生成され、captcha.ashx ページが要求されるたびにユーザーに送り返されます。私の問題は、HTTPHandler がセッションを保存しないことですか? 通常のページからセッションを取り戻そうとしましたが、存在しないという例外しか得られなかったので、トレースをオンにしてアクティブなセッションを確認しましたが、HTTPHandler が作成したセッションはリストされません (キャプチャ)。

HTTPHandler は IReadOnlySessionState を使用してセッションと対話します。HTTPHandler には読み取りアクセスしかなく、セッションを保存していませんか?

4

2 に答える 2

6

名前空間から IRequiresSessionState インターフェイスを実装してみてください。

このリンクを確認してください: http://anuraj.wordpress.com/2009/09/15/how-to-use-session-objects-in-an-httphandler/

于 2009-10-13T14:32:49.590 に答える
1

Handler は IRequiresSessionState を実装する必要があります。

public class CaptchaHandler : IHttpHandler, IRequiresSessionState
{
...
}
于 2009-10-13T14:37:43.293 に答える