0

所有,我正在尝试实现一个 HttpModule (IHttpModule) 来捕获页面请求并重定向到一个新页面。不幸的是,我似乎无法Session在新页面中使用 。因为Session是空的。

这是我的代码的样子。请审查它。

public class MyModule : IHttpModule
{
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);

        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            ....
            HttpContext.Current.Server.Transfer("newpage.aspx");//redirect to new page.
        }
}

中,代码newpage.aspx中有一个异常说,因为是null。有人能告诉我发生了什么吗?谢谢。Object reference not set to an instance of an objectHttpContext.Current.Session[xxx]HttpContext.Current.Session

更新

所有,我发现如果我使用HttpContext.Current.Response.Redirect重定向 url 。一切都好。我的意思是该Session对象在使用之前就已启动。但这不适用于Server.Transfer.

我已经知道这两者有什么区别。

4

1 回答 1

0

具有 2 个模块的正常 aspx 运行时管道是:

--> HttpModule_1.BeginRequest();  --> HttpModule_2.BeginRequest(); --> HttpHandler(Page)
<-- HttpModule_1.EndRequest();  <-- HttpModule_2.EndRequest(); <-- HttpHandler(Page)

将 HttpModule_1 想象为您的自定义模块,将 HttpModule_2 想象为 aspx 会话模块。

您的自定义模块首先运行,因此在您的模块运行时不会填充任何会话。

当 HttpModule_1 运行 BeginRequest 时,您添加一个 Server.Trasfer()。现在,服务器传输将立即执行请求页面的 HttpHandler,它会在不离开 BeginRequest 的情况下被调用,并且在处理程序完成后传输方法将运行 Request.End() 并终止处理。

因此,“newpage.aspx”的处理程序也将在会话模块之前运行。(实际上,会话模块永远不会运行,因为 Server.Transfer() 将结束请求)。

如果您保证会话模块在您的模块之前是进程,您应该解决问题(请参阅https://stackoverflow.com/a/2427632/953144)。

于 2013-07-31T10:27:42.917 回答