Rettelserne:
Da C# koden blev konverteret til VB.NET kode, blev noget kode åbenbart misfortolket.
Det er bl.a. denne VB.NET linie:
System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)
Den trækker 1 fra værdien i variablen fontSize. Det skal bare være: fontSize = fontSize - 1
Det samme med System.Math.Min, der skulle have været "i = i + 1"
Så er der formOK (som er bool/boolean, dvs sand/falsk, true/false) der var sat forkert i denne blok:
If Not (Me.CodeNumberTextBox.Text = Me.Session("TuringImageText").ToString) Then
Me.MessageLabel.CssClass = "error"
Me.MessageLabel.Text = "Validation code does not match. Please try again."
Me.CodeNumberTextBox.BackColor = System.Drawing.Color.Yellow
Me.CodeNumberTextBox.Text = ""
Me.Session("TuringImageText") = GenerateRandomCode()
'Label1.Text = this.Session["TuringImageText"].ToString(); //debug
formOK = False
Else
Den skal være True og ikke False.
Og den sidste ændring:
Hvis AutoEventWireup er sat til False, afvikles Page_Load ikke!
Den har jeg sat til True: AutoEventWireup="true"
Her er koden:
--- captcha.aspx (formen og genererer selve koden der indsættes i billedet):
<%@ Page Language="VB" AutoEventWireup="true" Debug="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Web.Mail" %>
<script runat="server">
Private random As Random = New Random
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim formOK As Boolean = true
If Not Me.IsPostBack Then
'Create a random code and store it in the Session object.
Me.Session("TuringImageText") = GenerateRandomCode()
Else
'Create a random code and store it in the Session object.
'On a postback, check the user input.
'Check Turing code
Try
Dim turingText = Me.Session("TuringImageText").ToString
Catch
Me.Session("TuringImageText") = GenerateRandomCode()
End Try
'Clear the input and create a new random code.
If Not (Me.CodeNumberTextBox.Text = Me.Session("TuringImageText").ToString) Then
Me.MessageLabel.CssClass = "error"
Me.MessageLabel.Text = "Validation code does not match. Please try again."
Me.CodeNumberTextBox.BackColor = System.Drawing.Color.Yellow
Me.CodeNumberTextBox.Text = ""
Me.Session("TuringImageText") = GenerateRandomCode()
'Label1.Text = this.Session["TuringImageText"].ToString(); //debug
formOK = True ' This must be set/reset to TRUE -- Denne skal saettes/nulstilles til TRUE
Else
'If the right code has been entered, clear the error message
Me.MessageLabel.Text = ""
Me.CodeNumberTextBox.BackColor = System.Drawing.Color.White
End If
' ---------------
' This part is optional! -- denne del kan fjernes!
If Me.fName.Text = "" Then
Me.fName.BackColor = System.Drawing.Color.Yellow
formOK = False
Else
Me.fName.BackColor = System.Drawing.Color.White
End If
' ---------------
If formOK = True Then
'Everything is OK, do whatever you need to with the submitted data
'Such as mailing it, inserting into a DB, etc.
Response.Write("<html><head>")
Response.Write("<script>")
Response.Write("alert('Thank you.\n\nYou will now be returned to the home page.');")
Response.Write("location.href='/';")
Response.Write("<" + HtmlTextWriter.SlashChar + "script>")
Response.Write("<" + HtmlTextWriter.SlashChar + "head><body><center><a href='/'>HOME<" + HtmlTextWriter.SlashChar + "a><" + HtmlTextWriter.SlashChar + "center><" + HtmlTextWriter.SlashChar + "body><" + HtmlTextWriter.SlashChar + "html>")
Response.End()
Else
'If there are validation errors write out an error message.
Label1.Text = "Required fields failed validation. They are hightlighted in yellow.<br />"
Label1.BackColor = System.Drawing.Color.Yellow
Label1.ForeColor = System.Drawing.Color.Red
End If
End If
End Sub
'Returns a string of six random digits.
Private Function GenerateRandomCode() As String
Dim s As String = ""
Dim c As Integer = 97
Dim i As Integer = 0
While i < 6
If random.Next(2) = 1 Then
c = random.Next(48, 57)
Else
c = random.Next(97, 122)
End If
s = String.Concat(s, Convert.ToChar(c).ToString)
System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
End While
Return s
End Function
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="
http://www.w3.org/1999/xhtml"><head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="default" runat="server">
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<img src="TuringImage.aspx" alt="" /><br />
Enter the code above in the box below to begin:<br />
<small>(Note: If you cannot read the numbers in the image, reload the page to generate a new one.)</small><br />
<asp:TextBox id="CodeNumberTextBox" runat="server"></asp:TextBox>
<asp:Label id="MessageLabel" runat="server"></asp:Label><br />
Name:<asp:TextBox runat="server" id="fName" maxlength="50" Columns="50" /><br />
<asp:Button id="SubmitButton" runat="server" Text="Submit"></asp:Button>
</form>
</body>
</html>
--- TuringImage.aspx (genererer selve billedet med teksten fra captcha.aspx):
<%@ Page Language="VB" AutoEventWireup="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.ComponentModel" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Drawing2D" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<script runat="server">
Private random As Random = New Random
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'Width and height of image
Dim width As Integer = 200
Dim height As Integer = 50
Dim familyName As String = "Times New Roman"
'Dim imageText As String = "123456"
Dim imageText As String = Me.Session("TuringImageText").ToString
'Create a new 32-bit bitmap image.
Dim bitmap As System.Drawing.Image = New Bitmap(width, height, PixelFormat.Format32bppArgb)
'Create a graphics object for drawing.
Dim g As Graphics = Graphics.FromImage(bitmap)
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As Rectangle = New Rectangle(0, 0, width, height)
'Fill in the background.
Dim hatchBrush As HatchBrush = New HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White)
g.FillRectangle(hatchBrush, rect)
'Set up the text font.
Dim size As SizeF
Dim fontSize As Single = rect.Height + 1
Dim font As Font
'Adjust the font size until the text fits within the image.
Do
fontSize = fontSize - 1
'System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)
font = New Font(familyName, fontSize, FontStyle.Bold)
size = g.MeasureString(imageText, font)
Loop While size.Width > rect.Width
'Set up the text format.
'font = New Font("Times New Roman", 12, FontStyle.Bold)
'size = g.MeasureString(imageText, font)
Dim format As StringFormat = New StringFormat
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
'Create a path using the text and warp it randomly.
Dim path As GraphicsPath = New GraphicsPath
path.AddString(imageText, font.FontFamily, CType(font.Style, Integer), font.Size, rect, format)
Dim v As Single = 4.0F
Dim points As PointF() = {New PointF(Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v)}
Dim matrix As Matrix = New Matrix
matrix.Translate(0.0F, 0.0F)
path.Warp(points, rect, matrix, WarpMode.Perspective, 0.0F)
'Draw the text.
hatchBrush = New HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray)
g.FillPath(hatchBrush, path)
'Add some random noise.
Dim m As Integer = Math.Max(rect.Width, rect.Height)
Dim i As Integer = 0
While i < CType((rect.Width * rect.Height / 30.0F), Integer)
Dim x As Integer = Me.random.Next(rect.Width)
Dim y As Integer = Me.random.Next(rect.Height)
Dim w As Integer = Me.random.Next(m / 50)
Dim h As Integer = Me.random.Next(m / 50)
g.FillEllipse(hatchBrush, x, y, w, h)
'System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
i = i + 1
End While
'Change the response headers to output a JPEG image.
Me.Response.Clear()
Me.Response.ContentType = "image/jpeg"
bitmap.Save(Me.Response.OutputStream, ImageFormat.Jpeg)
'Clean up.
'font.Dispose();
hatchBrush.Dispose()
g.Dispose()
End Sub
</script>