IRequiresSessionState - как его использовать?

Мне нужно изменить, когда я вижу состояние сеанса. Я узнал о IRequiresSessionState Marker Interface, но не смог выяснить, как его использовать. Я думаю, что я могу пропустить что-то очевидное. Может ли один из вас, С# гуру, дать мне быстрый шаг 1-2-3 (например)?

  • Создайте новый класс,
  • Поместите public interface IRequiresSessionState в него.
  • Используйте IRequiresSessionState('abra_cadabra') для изменения значения.

Ответ 1

  • Чтобы пометить класс, добавьте двоеточие в существующее имя класса и поместите маркер. Если бы у меня был класс: public class PageTools Помечено, это будет выглядеть как public class PageTools : IRequiresSessionState или с обоими интерфейсами, public class PageTools : IRequiresSessionState, IHttpHandler. В моем случае мой класс должен был быть отмечен только первым. Мне нужен обработчик.
  • Если вы щелкните правой кнопкой мыши маркер, который вы только что набрали, вы можете выбрать implement в меню (визуальная студия), и необходимые методы будут добавлены в ваш класс. Или вы можете просмотреть их и добавить их вручную.
  • После того, как у вас есть маркер IRequiresSessionState, вы можете протестировать его, чтобы проверить, является ли состояние сеанса только для чтения, и если он установлен для нового обработчика http.

    if (context.Handler is IReadOnlySessionState
        || context.Handler is IRequiresSessionState)
    {
        context.Handler = Handler();
    }
    
  • Обработчик http: MSDN расскажет вам многое о HttpHandlers и HttpModules. В моем случае мне нужен фиктивный обработчик, чтобы я мог получить доступ к состоянию сеанса, когда он обычно читается только (Page_PreInit). Поэтому в моем классе я добавил следующее:

    protected IHttpHandler Handler()
    {
        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler
            as MyHttpHandler;
        if (resourceHttpHandler != null) // set the original handler back 
        {                
            return resourceHttpHandler.OriginalHandler;
        }
        // at this point session state should be available      
        return HttpContext.Current.Handler;
    }
    
    public class MyHttpHandler : IHttpHandler, IRequiresSessionState
    {
        internal readonly IHttpHandler OriginalHandler;
    
        public MyHttpHandler(IHttpHandler originalHandler)
        {
            OriginalHandler = originalHandler;
        }
        public void ProcessRequest(HttpContext context)
        {
            // do not worry, ProcessRequest() will not be called,
            // but let be safe         
            throw new InvalidOperationException(
                "MyHttpHandler cannot process requests.");
        }
        public bool IsReusable
        {
            // IsReusable must be set to false since class has a member!
            get { return false; }
        }
    }
    

Здесь - ссылка на очень элегантный класс HttpModule, из которого я получил много или что я использовал. Я надеюсь, что это помогает кому-то.

Ответ 2

Вы должны получить свой HTTP-обработчик из класса IRequiresSessionState, чтобы получить доступ к SessionState.

public class MyHttpHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        var MyValue = context.Session["MyKey"] as String;

        MyValue = "Hello World";

        context.Session["MyKey"] = MyValue;
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

Ответ 3

Интерфейс IRequiresSessionState является интерфейсом маркера и не содержит методов, поэтому вы не можете использовать его так, как вы задаете в вопросе. Вы только реализуете интерфейс в обработчике HTTP, чтобы определить, что обработчик требует доступа для чтения и записи к значениям состояния сеанса.

Чтобы узнать, как вы его реализуете в обработчике HTTP, посмотрите эту ссылку: http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx