首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 驗證碼元件化封裝:從處理程式到可複用類別庫

     編輯:ASP.NET 基礎

重構動機

原始碼為單一 .ashx 處理程式,產生驗證碼並直接輸出圖片,存在三大問題:

  1. 程序式寫法:修改字體、顏色、干擾線需改動處理程式內部邏輯。
  2. 無法跨專案複用:WinForm、WPF、其他 Web 專案只能複製貼上修改。
  3. 職責不清:驗證碼產生與「存入 Session/Cookie」耦合,違反單一職責原則。

設計目標

  • 建立 ValidateCode 類別,暴露屬性配置(長度、字元集、字體、尺寸、顏色、干擾線/點密度等)。
  • 提供多種輸出方式:GetString()、GetBitmap()、GetByteArray()、GetStream()。
  • 不處理儲存:呼叫端自行決定存入 Session、Cookie、Cache 或分散式快取。
  • 輸出格式預設 BMP(無損、無需 GDI+ 編碼器參數),可擴充 PNG/JPEG。

使用範例:Generic Handler 僅 3 行

public class ValidateCodeHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var vc = new ValidateCode { Length = 4, FontSize = 22, Chaos = true };
        context.Session["ValidateCode"] = vc.GetString();      // 1. 取字串存 Session
        context.Response.BinaryWrite(vc.GetByteArray());       // 2. 取位元組輸出圖片
        context.Response.ContentType = "image/bmp";
    }
    public bool IsReusable => false;
}

核心類別結構(節錄)

public class ValidateCode
{
    // 可配置屬性
    public int Length { get; set; } = 4;
    public string CodeSerial { get; set; } = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public int FontSize { get; set; } = 20;
    public Color BackColor { get; set; } = Color.White;
    public Color[] FontColors { get; set; } = { Color.Black, Color.Blue, Color.Red };
    public bool Chaos { get; set; } = true; // 干擾線
    public int Padding { get; set; } = 2;

    // 核心產生邏輯
    private string GenerateCode() { /* 隨機取 CodeSerial 字元 */ }
    private Bitmap CreateImage(string code) { /* GDI+ 繪製文字、干擾線、噪點 */ }

    // 多種輸出
    public string GetString() => GenerateCode();
    public Bitmap GetBitmap() => CreateImage(GenerateCode());
    public byte[] GetByteArray() { using (var ms = new MemoryStream()) { GetBitmap().Save(ms, ImageFormat.Bmp); return ms.ToArray(); } }
    public Stream GetStream() { var ms = new MemoryStream(); GetBitmap().Save(ms, ImageFormat.Bmp); ms.Position = 0; return ms; }
}

專案結構建議

MyLib/
├─ ValidateCode.cs          // 核心類別
├─ ValidateCodeHandler.ashx // Web 專案引用的 Handler 範例
└─ Properties/AssemblyInfo.cs

編譯為 MyLib.dll,任何專案引用即可使用,WinForm 呼叫 GetBitmap() 顯示於 PictureBox,Web 呼叫 GetByteArray() 配合 BinaryWrite。

原始碼下載

完整 VS2010 方案(含 old/new 對比版本):
/201012/yuanma/yanzhengma.rar

心得

「拿來即用」不可取,但「過度設計」同樣有害。專案緊急時,能跑通即可;有餘力時,花 30 分鐘將通用邏輯抽離成元件,長遠受益。關鍵在於思考後再決定,而非盲目複製。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved