我需要能够更改Session状态的查看时间。我发现了IRequiresSessionState
标记接口,但无法弄清如何使用它。我想我可能遗漏了一些显而易见的东西。你们中的某个C#大师能否给我快速的1-2-3步骤(例如)?
- 创建一个新类;
- 在其中放置
public interface IRequiresSessionState
; - 使用
IRequiresSessionState('abra_cadabra')
更改值。
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 关于Http处理程序和Http模块的知识详见此链接。在我的情况下,我需要一个虚拟的处理程序来让我在通常只读取(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类的参考,我从中获得了很多我所用到的东西。希望这能对某人有所帮助。
只需从 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处理程序中实现该接口,以标识处理程序需要读取和写入会话状态值。