Сессия С# не сохраняется из HTTPHandler

У меня есть 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 доступ только для чтения и, следовательно, не сохраняет сеанс?


person Patrick    schedule 13.10.2009    source источник


Ответы (2)


Попробуйте реализовать интерфейс IRequiresSessionState из пространства имен.

Проверьте эту ссылку: http://anuraj.wordpress.com/2009/09/15/how-to-use-session-objects-in-an-httphandler/

person Anuraj    schedule 13.10.2009
comment
+1 - поиск старых вопросов редко тратится впустую. Это решило ту же проблему и для меня - спасибо. - person ChrisA; 04.05.2010

Ваш обработчик должен реализовать IRequiresSessionState.

public class CaptchaHandler : IHttpHandler, IRequiresSessionState
{
...
}
person Carl Bergquist    schedule 13.10.2009