【问题标题】:IRequiresSessionState - how do I use it?IRequiresSessionState - 我该如何使用它?
【发布时间】:2009-09-03 19:59:13
【问题描述】:

当我可以看到会话状态时,我需要能够进行更改。我发现了IRequiresSessionState Marker Interface,但还没有弄清楚如何使用它。我想我可能遗漏了一些明显的东西。你们中的一个 C# 大师可以给我一个快速的 1-2-3 步骤(例如)吗?

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:
    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; }
          }
      }
      

    Here 是对一个非常优雅的 HttpModule 类的引用,我从中获得了很多或使用了什么。我希望这可以帮助别人。

    【讨论】:

      【解决方案2】:

      您只需从 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; }
          }
      }
      

      【讨论】:

      • 你能解释一下我将如何从 IRequiresSessionState 中创建 HTTP Handler 类吗?
      • 叮。丁。花了几个小时试图弄清楚为什么我的会话状态变量在我的助手中起作用。 self.thank = Ton(1).
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2010-10-18
        • 2011-07-16
        • 2013-12-07
        • 1970-01-01
        相关资源
        最近更新 更多