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

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

  1. Создать новый класс,
  2. Положил public interface IRequiresSessionState в этом.
  3. использование IRequiresSessionState('abra_cadabra') изменить значение.

3 ответа

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

    if (context.Handler is IReadOnlySessionState
        || context.Handler is IRequiresSessionState)
    {
        context.Handler = Handler();
    }
    
  4. Обработчик 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's 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, из которого я получил много или что я использовал. Я надеюсь, что это помогает кому-то.

Вам просто нужно извлечь класс 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; }
    }
}

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

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

Другие вопросы по тегам