У меня есть HTTPHandler, который создает изображение Captcha для пользователя всякий раз, когда запрашивается страница captcha.ashx. Код для него прост:
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>
...
Это работает отлично, изображение генерируется и отправляется обратно пользователю всякий раз, когда запрашивается страница captcha.ashx. Моя проблема в том, что HTTPHandler не сохраняет сеанс? Я попытался вернуть сеанс с обычной страницы, но получил только исключение о том, что его не существует, поэтому я включил трассировку, чтобы увидеть, какие сеансы активны, и в нем не указан сеанс, созданный HTTPHandler ( Капча).
HTTPHandler использует IReadOnlySessionState для взаимодействия с сеансами. Имеет ли HTTPHandler доступ только для чтения и, следовательно, не сохраняет сеанс?