我正在尝试访问查询字符串参数并将其保存到 session 变量中。由于我正在开发的解决方案有几个基本布局,最简单的方法是将其添加到管道处理程序中。但是,我的代码失败了,因为 args.Context.Session 为 null:
public class SaveQueryStringToSession : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
Assert.ArgumentNotNull((object)args, "args");
string queryString = WebUtil.GetQueryString("parm1");
if (queryString.Length <= 0)
return;
args.Context.Session["parm1"] = queryString;
}
}
当将此方法插入 HttpRequestBegin 或 HttpRequestEnd 管道时,会发生这种情况。很想知道为什么,以及是否有标准的解决方法或模式可以在这里使用。 (是的,我会添加一个空检查。无需指出。)
我在 IIS 7.5(集成 .Net 2.0)上运行 Sitecore Sitecore.NET 6.4.1(修订版 110720)
可能相关的链接:
最佳答案
HttpRequestBegin 管道连接到 HttpApplication.BeginRequest 事件,并且该事件在 HttpSession 对象实例化之前触发。使用 HttpRequestEnd 管道不起作用,因为在触发 HttpApplication.EndRequest 事件时,HttpSession 对象已被释放。
触发 PostAcquireRequestState 事件后, session 变得可用。要拦截此行为,请创建一个实现 IHttpModule 的类,并将其添加到 Web.config 中的
这是访问 session 和查询字符串的 HttpModule 代码:
public class MyHttpModule :IHttpModule
{
public void Init(HttpApplication context)
{
context.PostAcquireRequestState += RequestHandler;
}
public void Dispose()
{
//
}
public void RequestHandler(object sender, EventArgs e)
{
var app = (HttpApplication) sender;
if (app.Context.Handler is IRequiresSessionState)
{
var session = app.Session;
var queryString = app.Request.QueryString["test"];
session["test"] = queryString;
}
}
}
值得注意的是,Sitecore 的 HttpRequestBegin 和 HttpRequestEnd 管道通过 HttpModule 连接到 ASP.NET:
<add type="Sitecore.Nexus.Web.HttpModule,Sitecore.Nexus"
name="SitecoreHttpModule" />
感谢@ddysart为我指明了正确的方向,并感谢this回答要监听的正确事件。
关于sitecore - 访问 HttpRequest 管道中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354298/