Mã nguồn ví dụ BotDetect ASP.NET 2.0 CAPTCHA Troubleshooting - C#

Mã nguồn ví dụ BotDetect ASP.NET CAPTCHA hướng dẫn cách sử dụng tiện ích lưu lỗi sẵn có của BotDetect để giải quyết các vấn đề của CAPTCHA. Ví dụ này tương đương với kết quả bạn đạt được khi làm theo Hướng dẫn lưu lỗi của BotDetect vào file văn bản. Nó giả lập một biệt lệ của mã BotDetect và chỉ cách lưu và xử lý lỗi.

Xin lưu ý

Vì ví dụ này lưu lỗi vào một file văn bản trên hệ thống file của máy chủ, nó chỉ chạy trên môi trường full trust.

Vị trí dự án mẫu

Mặc định, dự án mẫu này được cài đặt tại
C:\Program Files\Lanapsoft\BotDetect\ASP.NET 2.0\v2.0\Samples\CSharpBotDetect2TroubleshootingDemo\.

Bạn cũng có thể chạy nó từ Start Menu:
Programs > Lanapsoft > BotDetect > ASP.NET 2.0 > v2.0 > Samples > C# BotDetect CAPTCHA Troubleshooting Sample.

Default.aspx

Mã nguồn đầy đủ

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Assembly="Lanap.BotDetect" Namespace="Lanap.BotDetect" 
  TagPrefix="BotDetect" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>BotDetect Demo</title>
    <link type='text/css' rel='Stylesheet' href="StyleSheet.css" />
</head>
<body>
    <form id="form1" runat="server">
    <fieldset id="Preview">
        <legend>
            <span id="PreviewLegend">CAPTCHA Validation Logging</span>
        </legend>
        <div id="PromptDiv">
            <span id="Prompt">Type the characters you see in 
              the picture</span>
        </div>
        <div id="CaptchaDiv">
            <BotDetect:Captcha ID="SampleCaptcha" runat="server" />
        </div>
        <div id="ValidationDiv">
            <asp:TextBox ID="CodeTextBox" runat="server">
            </asp:TextBox>
            <asp:Button ID="ValidateButton" runat="server" />
            <asp:Label ID="MessageCorrectLabel" runat="server">
            </asp:Label>
            <asp:Label ID="MessageIncorrectLabel" runat="server">
            </asp:Label>
        </div>
        <div class="ValidationTroubleshooting">
            <p>All Captcha validation attempts will be logged to the 
              'debug.txt' file in the sample folder.</p>
        </div>
        <div class="Troubleshooting">
            <p>
                <asp:Label ID="DebugLabel" runat="server"></asp:Label>
            </p>
        </div>
    </fieldset>
    
    <fieldset id="TroubleshootingError">
        <legend><span id="TroubleshootingErrorLegend">CAPTCHA Error 
            Logging</span></legend>

        <div class="Troubleshooting">
            <p>Clicking 'Simulate Error' will throw a fake BotDetect 
              exception and log it to the 'error.txt' file in the 
              sample folder.</p>
        </div>
        <asp:Button ID="CauseErrorButton" runat="server" 
            OnClick="CauseErrorButton_Click" />
        <div class="Troubleshooting">
            <p>
                <asp:Label ID="ErrorLabel" runat="server"></asp:Label>

            </p>
        </div>
    </fieldset>

    <div id="Note">
        <span>NOTE: the Trial version will use "LANAP" instead of a 
          random code in 50% of renderings.</span>
    </div>
    </form>
</body>
</html>

Giải thích

Bên cạnh các thành tố thông thường để thêm BotDetect CAPTCHA vào trang ASP.NET, file này chứa thêm một nút để giả lập một biệt lệ của BotDetect và các thành tố khác liên quan đến hiển thị.

Default.aspx.cs

Mã nguồn đầy đủ

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_PreRender(object sender, EventArgs e)
    {
        /// initial page setup
        if (!IsPostBack)
        {
            /// set control text
            ValidateButton.Text = "Validate";
            MessageCorrectLabel.Text = "Correct!";
            MessageIncorrectLabel.Text = "Incorrect!";

            /// these messages are shown only after validation
            MessageCorrectLabel.Visible = false;
            MessageIncorrectLabel.Visible = false;

            CauseErrorButton.Text = "Simulate error";
            ErrorLabel.Text = "An error has been generated. 
              Please check the 'error.txt' file.";
								
            DebugLabel.Visible = false;
            DebugLabel.Text = "A validation attempt has been logged. 
              Please check the 'debug.txt' file.";
        }

        if (null != Session["error"])
        {
            ErrorLabel.Visible = true;
            MessageCorrectLabel.Visible = false;
            MessageIncorrectLabel.Visible = false;
            Session["error"] = null;
            DebugLabel.Visible = false;
        }
        else
        {
            ErrorLabel.Visible = false;
        }
				
        // clear user input on Reload button clicks
        string scriptTemplate = @"
          function LBD_ClearUserInput() {{
            var LBD_textBox = document.getElementById('{0}');
            if(LBD_textBox) {{
              LBD_textBox.value = '';
            }}
          }}
          LBD_RegisterHandler('PreReloadCaptchaImage', 
            LBD_ClearUserInput);
        ";
        string script = String.Format(scriptTemplate, 
          CodeTextBox.ClientID);
					
        if (!Page.ClientScript.IsStartupScriptRegistered(
            "CaptchaReloadClearInput"))
        {
          Page.ClientScript.RegisterStartupScript(this.GetType(), 
            "CaptchaReloadClearInput", script, true);
        }

        // automatically lowercase user input
        CodeTextBox.Attributes.Add("onkeyup", 
            "this.value = this.value.toLowerCase();");

        if (IsPostBack)
        {
            /// validate the input code, and show the 
            /// appropriate message 
            string code = CodeTextBox.Text.Trim().ToUpper();
            if (SampleCaptcha.Validate(code))
            {
                MessageCorrectLabel.Visible = true;
                MessageIncorrectLabel.Visible = false;
            }
            else
            {
                MessageCorrectLabel.Visible = false;
                MessageIncorrectLabel.Visible = true;
            }
						
            DebugLabel.Visible = true;

            /// clear previous user code input
            CodeTextBox.Text = null;
        }
    }

    protected void CauseErrorButton_Click(object sender, EventArgs e)
    {
        Session["error"] = true;
        throw new Lanap.BotDetect.Exceptions.CaptchaWebException(
            "Simulated exception");
    }
}

Giải thích

Bên cạnh mã khởi động và xác thực CAPTCHA, phương thức xử lý sự kiện CauseErrorButton_Click được dùng để tạo một biệt lệ giả lập của BotDetect. Vì đây là một ví dụ đơn giản chỉ có một trang dùng cả trước và sau khi biệt lệ xảy ra, chúng ta cũng dùng một cờ Session để hiển thị thông tin lỗi.

Không có mã xử lý lỗi trong mã xữ lý trang, vì một HttpModule đặc biệt được đăng ký trong file Web.config, để lưu lại lỗi và ghi thông tin lỗi ra file văn bản.

Global.asax

Mã nguồn đầy đủ

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup

    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown

    }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs
        Response.Redirect("Default.aspx");

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the 
        // sessionstate mode is set to InProc in the Web.config file. 
        // If session mode is set to StateServer or SQLServer, 
        // the event is not raised.
				
    }
       
</script>

Giải thích

Vì việc lưu lỗi của BotDetect phát lại biệt lệ sau khi lưu chi tiết, bạn có thể xử lý tất cả các biệt lệ trong ứng dụng một cách nhất quán. Trong ví dụ đơn giản này, chúng ta chỉ việc bỏ qua lỗi và vẽ lại trang.

Web.config

Mã nguồn đầy đủ

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <configSections>
    <section name="log4net" 
      type="log4net.Config.Log4NetConfigurationSectionHandler, 
      log4net"/>
  </configSections>
  <log4net configSource="log4net.config"/>
  <connectionStrings/>
  <system.web>
    <httpHandlers>
      <add verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect"/>
    </httpHandlers>
    <httpModules>
      <add type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
        Lanap.BotDetect.Troubleshooting" name="LoggingModule"/>
    </httpModules>
    <sessionState mode="InProc" cookieless="AutoDetect" timeout="20" 
      sessionIDManagerType="Lanap.BotDetect.Persistence.
      CustomSessionIDManager, Lanap.BotDetect" />
    <!-- 
      Set compilation debug="true" to insert debugging 
      symbols into the compiled page. Because this 
      affects performance, set this value to true only 
      during development.
    -->
    <compilation debug="false">
      <assemblies>
        <add assembly="System.Design, Version=2.0.0.0, 
          Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <!--
      The <authentication> section enables configuration 
      of the security authentication mode used by 
      ASP.NET to identify an incoming user. 
    -->
    <authentication mode="None"/>
    <!--
      The <customErrors> section enables configuration 
      of what to do if/when an unhandled error occurs 
      during the execution of a request. Specifically, 
      it enables developers to configure html error pages 
      to be displayed in place of a error stack trace.

      <customErrors mode="RemoteOnly" 
        defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
      </customErrors>
    -->
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="LanapCaptchaHandler" />
      <add name="LanapCaptchaHandler" preCondition="integratedMode" 
        verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
    </handlers>
    <modules>
      <remove name="LoggingModule" />
      <add name="LoggingModule" 
        preCondition="integratedMode" 
        type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
        Lanap.BotDetect.Troubleshooting" />
    </modules>
  </system.webServer>
</configuration>

Giải thích

Bên cạnh HttpHandler và khai báo Session State thông thường để dùng BotDetect CAPTCHA, thêm hai thành tố cần thiết để cho phép lưu lỗi của BotDetect. Thứ nhất là đăng ký HttpModule trong phần <httpModules>, để khởi động module đặc biệt LoggingModule.

Thứ hai là khai báo <configSection>, để đăng ký phần cấu hình đặc biệt cho thiết lập log4net (framework lưu lỗi mã nguồn mở được sử dụng để lưu lỗi). Sử dụng cú pháp cấu hình log4net, phần <log4net> thiết lập một máy lưu lỗi viết chi tiết biệt lệ vào file văn bản tên là error.txt nằm trong cùng thư mục với file web.config. log4net cung cấp nhiều tuỳ chọn lưu lỗi từ vị trí file output khác nhau đến mức thông báo khác nhau (trace, debug, và các thông báo khác), mà có thể được xữ lý theo nhiều cách khác nhau. Để đơn giản, ví dụ này sử dụng file đơn giản – nếu bạn hứng thú với các tuỳ chọn khác, xin hãy tham khảo tài liệu của log4net.

Log4net.config

Mã nguồn đầy đủ

<?xml version="1.0"?>

<!-- This section contains the log4net configuration settings -->
<log4net debug="false">

  <!-- Errors are logged to a 'error.txt' file  -->
  <appender name="ErrorFileAppender" 
      type="log4net.Appender.FileAppender">
    <file value="error.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout,log4net">
      <conversionPattern 
        value="%date [%thread] %type - %n%n%message%n%n" />
    </layout>
  </appender>

  <!-- Error logging is enabled, comment-out to disable -->
  <logger name="ErrorLogger">
    <level value="ERROR" />
    <appender-ref ref="ErrorFileAppender" />
  </logger>
	
  <!-- Debug info is logged to a 'debug.txt' file  -->
  <appender name="DebugFileAppender" 
      type="log4net.Appender.FileAppender">
    <file value="debug.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout,log4net">
      <conversionPattern 
        value="%date [%thread] %type - %n%n%message%n%n" />
    </layout>
  </appender>

  <!-- Debug logging is enabled, comment-out to disable -->
  <logger name="DebugLogger">
    <level value="DEBUG" />
    <appender-ref ref="DebugFileAppender" />
  </logger>

</log4net>

Giải thích

Sử dụng cú pháp cấu hình log4net, phần <log4net> thiết lập một máy lưu lỗi viết chi tiết biệt lệ vào file văn bản tên là error.txt nằm trong cùng thư mục với file web.config.

log4net cung cấp nhiều tuỳ chọn lưu lỗi từ vị trí file output khác nhau đến mức thông báo khác nhau (trace, debug, và các thông báo khác), mà có thể được xữ lý theo nhiều cách khác nhau. Để đơn giản, ví dụ này sử dụng file đơn giản – nếu bạn hứng thú với các tuỳ chọn khác, xin hãy tham khảo tài liệu của log4net.

Phiên bản hiện tại của BotDetect

Xin lưu ý

Trang này là bản dịch tiếng Việt không chính thức của trang gốc tiếng Anh: BotDetect ASP.NET 2.0 CAPTCHA Troubleshooting C# Code Sample và có thể không chính xác, không đầy đủ hoặc không cập nhật.

Cập nhật ngày 2009-11-30. Áp dụng cho BotDetect ASP.NET CAPTCHA v2.0.15 và BotDetect ASP CAPTCHA v2.0.9.

language: English Español Tiếng Việt