sitecore - 访问 HttpRequest 管道中的 session

标签 sitecore

我正在尝试访问查询字符串参数并将其保存到 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 中的 元素中。 HttpModule 代码需要检查请求是否需要 session 状态,因为尝试读取静态资源请求的 session 将引发异常。

这是访问 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/

相关文章:

sitecore - 值不能为空。参数名称: value Sitecore

asp.net - 为什么 Sitecore Fast 查询不适用于项目?

web-config - 从 sitecore 中的 web.config 获取设置

sitecore - Sitecore 8.0 发布选项

c# - 在运行时检查 Glass Mapper V3 类型

c# - Sitecore 语言嵌入多个站点

telerik - 自定义 Sitecore 富文本编辑器的默认配置

.net - 找不到配置节点: wffmRepository

sitecore:在xslt渲染中获取绝对url

sitecore - 自定义 Sitecore 内容编辑器语言选择器