强制HttpHandler使用SessionState

时间:2011-11-23 20:47:05

标签: asp.net .net session httphandler

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

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

2 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分:0)

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

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