IRequiresSessionState - как я использую его?

Если у Вас есть compizconfig менеджер по настройкам (ccsm) существует плагин, названный 'масштабом', который он покажет Вам всем, окна открываются на текущей рабочей области. enter image description here

16
задан wonea 7 October 2013 в 08:55
поделиться

3 ответа

  1. Чтобы отметить класс, добавьте двоеточие к существующему классу имя и поставить маркер. Если бы у меня был класс: открытый класс PageTools Отмечено, это будет выглядеть как открытый класс PageTools: IRequiresSessionState или с обоими интерфейсами, открытый класс PageTools: IRequiresSessionState, IHttpHandler . В моем случае мой класс нужно было только отметить первым. Моему обработчику нужны и то, и другое.
  2. Если вы щелкнете правой кнопкой мыши по маркеру, которую вы только что набрали, вы можете выбрать реализовать из меню (Visual Studio), и необходимые методы будут добавлены в ваш класс. Или вы можете найти их и добавить вручную.
  3. Когда у вас есть маркер IRequiresSessionState, вы можете проверить, является ли состояние сеанса только для чтения, и, если да, установить новый обработчик http.

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

     protected IHttpHandler Handler ()
    {
     MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler
     как MyHttpHandler;
     if (resourceHttpHandler! = null) // вернуть исходный обработчик 
     { 
     вернуть resourceHttpHandler.OriginalHandler;
     }
     // в этот момент состояние сеанса должно быть доступно 
     вернуть HttpContext.Current.Handler;
    }
    
    открытый класс MyHttpHandler: IHttpHandler, IRequiresSessionState
    {
     только для внутреннего чтения IHttpHandler OriginalHandler;
    
     общедоступный MyHttpHandler (IHttpHandler originalHandler)
     {
     OriginalHandler = originalHandler;
     }
     public void ProcessRequest (контекст HttpContext)
     {
     // не волнуйтесь, ProcessRequest () не будет вызван,
     // но будем осторожны 
     выбросить новое исключение InvalidOperationException (
     «MyHttpHandler не может обрабатывать запросы.»);
     }
     public bool IsReusable
     {
     // IsReusable должен иметь значение false, поскольку у класса есть член!
    получить {вернуть ложь; }
     }
    }
    

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

12
ответ дан 30 November 2019 в 21:54
поделиться

Вам нужно просто унаследовать свой класс HTTP Handler от 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; }
    }
}
9
ответ дан 30 November 2019 в 21:54
поделиться

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

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

2
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: