从图像生成的验证码并不总是将字符串放入会话中

时间:2014-01-09 20:41:53

标签: c# asp.net vb.net session captcha

我正在使用.NET验证码,其中验证码图像是从文件创建的,如下所示: myFile.aspx有这一行:     < img src =“/ CImage.aspx”/>

调用文件(代码隐藏为VB)始终加载验证码生成的图像。 CImage.aspx是C#。同样,总是返回并显示图像。

CImage.aspx.cs将一个字符串变量放入session中,我的调用页面将用户从文本框输入的内容与CImage.aspx.cs放入会话的内容进行比较。通常,页面崩溃,因为会话中没有任何内容。但是,captchaImage.aspx始终会写入图像。

使用CImage.aspx调用我的页面是在VB中。

为什么“有时”会成为会话变量进行比较,但通常没有。 (除非你刷新页面)

CImage.aspx.cs:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing.Imaging;
public partial class CImage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Create a random code and store it in the Session object.
        this.Session["CaptchaImageText"] = GenerateRandomCode();
        // Create a CAPTCHA image using the text stored in the Session object.
        RandomImage ci = new RandomImage(this.Session
            ["CaptchaImageText"].ToString(), 300, 75);
        // Change the response headers to output a JPEG image.
        this.Response.Clear();
        this.Response.ContentType = "image/jpeg";
        // Write the image to the response stream in JPEG format.
        ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);
        // Dispose of the CAPTCHA image object.
        ci.Dispose();
    }

    // Function to generate random string with Random class.
    private string GenerateRandomCode()
    {
        Random r = new Random();
        string s = "";
        for (int j = 0; j < 5;j++)
        {
            int i = r.Next(3);
            int ch;
            switch (i)
            {
                case 1:
                    ch = r.Next(0, 9);
                    s = s + ch.ToString();
                    break;
                case 2:
                    ch = r.Next(65, 90);
                    s = s + Convert.ToChar(ch).ToString();
                    break;
                case 3:
                    ch = r.Next(97, 122);
                    s = s + Convert.ToChar(ch).ToString();
                    break;
                default:
                    ch = r.Next(97, 122);
                    s = s + Convert.ToChar(ch).ToString();
                    break;
            }
            r.NextDouble();
            r.Next(100, 1999);
        }
        return s;
    }
}

0 个答案:

没有答案