Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 强制HttpHandler使用SessionState_Asp.net_.net_Session_Httphandler - Fatal编程技术网

Asp.net 强制HttpHandler使用SessionState

Asp.net 强制HttpHandler使用SessionState,asp.net,.net,session,httphandler,Asp.net,.net,Session,Httphandler,我正在尝试定制一个通过HttpHandler路由所有请求的销售产品。处理程序分析请求以确定将用户路由到哪个页面,并执行Server.Transfer()。不幸的是,我需要访问页面上的SessionState,而处理程序没有实现IRequiresessionState,并且被标记为内部,因此我无法从中继承。在谷歌搜索了很多次之后,我发现最好的解决方案是创建一个在请求生命周期的不同时间点更改处理请求的处理程序。在PostapRequestHandler上,我会将处理请求的处理程序更改为我自己的处理程

我正在尝试定制一个通过HttpHandler路由所有请求的销售产品。处理程序分析请求以确定将用户路由到哪个页面,并执行Server.Transfer()。不幸的是,我需要访问页面上的SessionState,而处理程序没有实现IRequiresessionState,并且被标记为内部,因此我无法从中继承。在谷歌搜索了很多次之后,我发现最好的解决方案是创建一个在请求生命周期的不同时间点更改处理请求的处理程序。在PostapRequestHandler上,我会将处理请求的处理程序更改为我自己的处理程序,该处理程序实现IRequiresessionState和PostAcquireRequestState,我会将其映射回


这是可行的,但有谁有更好的解决方案吗

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


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

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


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

我找到了一种更优雅的方法来启用会话状态。您可以重写处理程序的会话状态行为。我创建了一个强制会话状态的模块

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);
        }
    }
}

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

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);
        }
    }
}

您链接到的
HttpModule
代码在我看来相当不错。您链接到的
HttpModule
代码在我看来相当不错。