IRequiresSessionState - как мне его использовать?
Мне нужно иметь возможность изменить, когда я вижу состояние сеанса. Я узнал о IRequiresSessionState
Интерфейс маркера, но не смог понять, как его использовать. Я думаю, что я могу упустить что-то очевидное. Может ли один из вас, гуру C#, дать мне быстрый шаг 1-2-3 (например)?
- Создать новый класс,
- Положил
public interface IRequiresSessionState
в этом. - использование
IRequiresSessionState('abra_cadabra')
изменить значение.
3 ответа
- Чтобы пометить класс, добавьте двоеточие к существующему имени класса и поставьте маркер. Если бы у меня был класс:
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'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