2009-10-13 70 views
2

我有一個HTTPHandler,只要請求captcha.ashx頁面,就會向用戶生成一個驗證碼圖像。它的代碼很簡單:未從HTTPHandler保存的C#會話

 CaptchaHandler handler = new CaptchaHandler(); 
     Random random = new Random(); 
     string[] fonts = new string[4] { "Arial", "Verdana", "Georgia", "Century Schoolbook" }; 
     string code = Guid.NewGuid().ToString().Substring(0, 5); 
     context.Session.Add("Captcha", code); 

     Bitmap imageFile = handler.GenerateImage(code, 100, 70, fonts[random.Next(0,4)]); 
     MemoryStream ms = new MemoryStream(); 
     imageFile.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 

     byte[] buffer = ms.ToArray(); 

     context.Response.ClearContent(); 
     context.Response.ContentType = "image/png"; 
     context.Response.BinaryWrite(buffer); 
     context.Response.Flush(); 

然後在我的正規的網站,我有以下幾點:

... 
<img id="securityCode" src="captcha.ashx" alt="" /><br /> 
<a href="javascript:void(0);" onclick="javascript:refreshCode();">Refresh</a> 
... 

這工作完全,生成圖像,併發送回用戶只要驗證碼。請求ashx頁面。我的問題是HTTPHandler不保存會話? 我試圖從正常頁面恢復會話,但我只有一個異常說它不存在,所以我打開跟蹤來查看哪些會話是活動的,並沒有列出HTTPHandler創建的會話(驗證碼)。

HTTPHandler使用IReadOnlySessionState與會話交互。 HTTPHandler是否只具有讀取權限,因此不存儲會話?

回答

1

處理程序需要實現IRequiresSessionState。

public class CaptchaHandler : IHttpHandler, IRequiresSessionState 
{ 
... 
}