65.9K
CodeProject 正在变化。 阅读更多。
Home

为 Visual WebGUI 创建验证码

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (7投票s)

2008年9月17日

CPOL

2分钟阅读

viewsIcon

34049

如何通过实现 IGatewayControl 为 Visual WebGUI 创建验证码。

引言

我目前正在使用 Visual WebGUI 和 C# 作为编程语言开发一个系统。有关 Visual WebGUI (WGX) 的更多信息,请点击这里。 我需要一种机制来验证网站的注册是由人完成的,而不是由一些垃圾邮件机器人或脚本完成的。 这就是验证码的作用。

问题所在

问题是我找不到任何现有的 Visual WebGUI 的验证码。 我有两个选择

  1. 使用 AspControlBoxBase 控件将现有的 ASP 页面嵌入到我的表单/页面上。
  2. 开发一个 Visual WebGUI 控件。

作为一个真正的技术人员,由于各种原因(主要是因为我认为这将是困难和挑战),我选择了选项 2。

更多关于验证码的信息

在 CodeProject 上,我找到了 这篇文章,它更详细地解释了验证码。 本质上,验证码是一个包含加扰文本的像素矩阵,这使得使用一些 OCR 从图像中提取文本非常困难。 验证码本身就是一门科学。 有些非常复杂,具有针对视障人士的特殊功能,并带有文本到语音转换器。 但这不是本文的重点。

简而言之,我们需要一些东西将**文本转换为验证码图像**。

WGX 网关处理程序

首先,我对 WGX 控件进行了一些搜索,找到了 这篇文章 关于开发 Visual WGX 网关处理程序,我决定将网关的使用与 WGX 控件结合起来。

网关处理程序是一种巧妙的方法,使类和控件能够处理它们自己的对浏览器的 HTTP 响应。 HTTP 处理程序可以以包含的方式响应浏览器上的任何类型的数据 - HTML、XML 甚至二进制图像/位图数据。

可以通过在您的类中实现 IGatewayControl 接口来创建网关句柄

IGatewayHandler IGatewayControl.GetGatewayHandler(IContext objContext, 
                                                  string strAction)
{
  //here we write html or data to HttpContext.Current.
  //     Response.OutputStream that wil end up in the browser
}

WGX 控件

由于验证码是从某些文本转换而来的加扰图像,我决定创建一个新控件,并从现有的 WGX PictureBox 控件派生它。 你知道吗 - PictureBox 已经有一个 Text 属性,因为它派生自 Control

所以,大部分工作已经完成了。 我所要做的就是**将 PictureBox 控件与网关处理程序结合起来**。 下一步是创建一个派生自 PictureBox 且实现 IGatewayControl 的 WebGUI 控件。

public class Captcha : PictureBox, IGatewayControl
{
    public void RenderImage()
    {
        //this is called to render the image based 
        //on the Text property of the control
    }
}

新控件

这就是我们最终得到的类。 令人惊讶的是,非常非常简单。

public class Captcha : PictureBox, IGatewayControl
{
    public Captcha()
    {
    }

    public void RenderImage()
    {                       
        this.Image = new GatewayResourceHandle(new GatewayReference(this, "image"));
        // img.Image;
        this.Update();
    }        

    IGatewayHandler IGatewayControl.GetGatewayHandler(IContext objContext, 
                                                      string strAction)
    {
        CaptchaImage img = new CaptchaImage(this.Text, this.Width, this.Height);
        img.Image.Save(HttpContext.Current.Response.OutputStream, 
                       System.Drawing.Imaging.ImageFormat.Jpeg);
        return null;
    }
}

我们如何使用它

将验证码控件代码添加到您的项目并编译您的项目。 一旦您编译了您的项目,验证码将出现在 Visual Studio 控件工具箱中。

将控件拖到您的表单上。 然后,根据您的需要更改高度和宽度。

为了更新和刷新验证码图像,请调用下面的函数。(记得从 PageLoad 事件或构造函数中的 InitializeComponent() 之后调用它。)

private void SetCapthca()
{
    captchaMain.Text = "vn0y8";//or some other sandom text generator
    captchaMain.RenderImage();
}

一张截图

这将在控件中显示控件的 Text 属性的加扰图像

screenshot.png

© . All rights reserved.