为 Visual WebGUI 创建验证码






4.45/5 (7投票s)
如何通过实现 IGatewayControl 为 Visual WebGUI 创建验证码。
引言
我目前正在使用 Visual WebGUI 和 C# 作为编程语言开发一个系统。有关 Visual WebGUI (WGX) 的更多信息,请点击这里。 我需要一种机制来验证网站的注册是由人完成的,而不是由一些垃圾邮件机器人或脚本完成的。 这就是验证码的作用。
问题所在
问题是我找不到任何现有的 Visual WebGUI 的验证码。 我有两个选择
- 使用
AspControlBoxBase
控件将现有的 ASP 页面嵌入到我的表单/页面上。 - 开发一个 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
属性的加扰图像