2009-10-13 9 views
2

J'ai un HTTPHandler qui produit une image Captcha à l'utilisateur chaque fois que la page captcha.ashx est demandée. Le code est simple:C# Session non enregistrée à partir de HTTPHandler

 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(); 

ensuite sur mon site Web régulièrement, je me suis ce qui suit:

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

Cela fonctionne parfaitement, l'image est générée et envoyée à l'utilisateur chaque fois que le captcha. La page ashx est demandée. Mon problème est que le HTTPHandler ne sauvegarde pas la session? J'ai essayé de récupérer la session de la page normale mais j'ai seulement une exception disant qu'elle n'existait pas, j'ai donc activé Trace pour voir quelles sessions sont actives et ne liste pas la session créée par HTTPHandler (Captcha).

HTTPHandler utilise IReadOnlySessionState pour interagir avec les sessions. Le HTTPHandler a-t-il seulement un accès en lecture et ne stocke donc pas la session?

Répondre

1

Votre gestionnaire doit mettre en œuvre IRequiresSessionState.

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