IRequiresSessionState - 我如何使用它?

17

我需要能够更改Session状态的查看时间。我发现了IRequiresSessionState标记接口,但无法弄清如何使用它。我想我可能遗漏了一些显而易见的东西。你们中的某个C#大师能否给我快速的1-2-3步骤(例如)?

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

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 关于Http处理程序和Http模块的知识详见此链接。在我的情况下,我需要一个虚拟的处理程序来让我在通常只读取(Page_PreInit)会话状态时访问它。所以我在我的类中添加了以下内容:

  5. 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类的参考,我从中获得了很多我所用到的东西。希望这能对某人有所帮助。


9

只需从 IRequiresSessionState 派生您的 HTTP Handler 类即可获得 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 Handler类吗? - Praesagus
叮咚。叮咚。花了几个小时试图弄清楚为什么我的会话状态变量在我的 Helper 中无法工作。self.thank = Ton(1)。 - Chris Catignani

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接