IRequiresSessionState - 我该如何使用它?

时间:2009-09-03 19:59:13

标签: c# asp.net

我需要能够在看到会话状态时进行更改。我发现了IRequiresSessionState标记界面,但未能弄清楚如何使用它。我想我可能会遗漏一些明显的东西。你们其中一个C#guru会给我一个快速的1-2-3步骤(例如)吗?

  1. 创建一个新类
  2. public interface IRequiresSessionState放入其中。
  3. 使用IRequiresSessionState('abra_cadabra')更改值。

3 个答案:

答案 0 :(得分:12)

  1. 要标记类,请在现有类名称中添加冒号并放置标记。 如果我上了课:public class PageTools 标记为:public class PageTools : IRequiresSessionState或两个接口public class PageTools : IRequiresSessionState, IHttpHandler。在我的情况下,我的班级只需要标记第一个。我的经纪人需要两个。
  2. 如果右键单击刚输入的标记,可以从菜单(visual studio)中选择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; }
        }
    }
    
  5. Here 是对非常优雅的HttpModule类的引用,我从中获得了很多或者我使用过的内容。我希望这可以帮助别人。

答案 1 :(得分:9)

您只需从 IRequiresSessionState 派生 HTTP处理程序类即可获得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; }
    }
}

答案 2 :(得分:2)

IRequiresSessionState界面是一个标记界面,不包含任何方法,因此您无法按照问题的方式使用它。您只在HTTP处理程序中实现接口,以识别处理程序需要对会话状态值的读写访问权。

要了解如何在HTTP处理程序中实现它,请查看以下链接:http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx