2011-11-23 50 views
1

我正在尝试自定义通过HttpHandler路由所有请求的出售产品。处理程序分析请求以确定将用户路由到哪个页面并执行Server.Transfer()。不幸的是,我需要访问页面上的SessionState,并且处理程序没有实现IRequiresSessionState并被标记为内部,因此我无法继承它。经过大量的搜索引擎优化后,我发现最好的解决方案是创建一个HttpModule,它改变请求生命周期中不同点处理请求的处理程序。在PostMapRequestHandler上,我会将处理请求的处理程序更改为我自己的实现IRequiresSessionState和PostAcquireRequestState的处理程序,并将其映射回来。强制HttpHandler使用SessionState

这工作,但没有人有更好的解决方案?

+0

您链接到的'HttpModule'代码对我来说看起来相当不错。 – LukeH

回答

0

另一种解决方案可能是通过需要会话状态的处理程序路由所有请求,然后通过调用ProcessRequest方法将这些请求传递给内部处理程序 - 您可以使用say Reflection(或使用处理程序工厂如果有的话)。

但是,使用HttpModule交换处理程序绝对是一个更好的解决方案。因为您可以选择通过查看请求的URL来选择交换处理程序。这样,您可能不必为所有请求加载/保存会话状态(这可能会导致进程外会话的操作昂贵)

1

我想出了一种更优雅的启用会话状态的方法。您可以覆盖处理程序的会话状态行为。我创建了一个强制会话状态的模块。

public class SessionEnablerModule : IHttpModule 
{ 
    public void Dispose() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.PostMapRequestHandler += new EventHandler(context_PostMapRequestHandler); 
    } 

    void context_PostMapRequestHandler(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 

     if ((app.Context.Handler.GetType().ToString().Equals("Handler I want to enable session state for"))) 
     { 
      //enable session state 
      app.Context.SetSessionStateBehavior(SessionStateBehavior.Required); 
     } 
    } 
}