Sitecore 访问HttpRequest管道中的会话

Sitecore 访问HttpRequest管道中的会话,sitecore,Sitecore,我正在尝试访问查询字符串参数并将其保存到会话变量。由于我正在处理的解决方案有几个基本布局,最简单的方法是将其添加到管道处理程序中。但是,我的代码失败,因为args.Context.Session为null: public class SaveQueryStringToSession : HttpRequestProcessor { public override void Process(HttpRequestArgs args) { Assert.Argumen

我正在尝试访问查询字符串参数并将其保存到会话变量。由于我正在处理的解决方案有几个基本布局,最简单的方法是将其添加到管道处理程序中。但是,我的代码失败,因为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;
    }
}
公共类SaveQueryStringToSession:HttpRequestProcessor
{
公共覆盖无效进程(HttpRequestArgs args)
{
Assert.ArgumentNotNull((object)args,“args”);
字符串queryString=WebUtil.GetQueryString(“parm1”);

如果(queryString.LengthHttpRequestBegin管道连接到HttpApplication.BeginRequest事件,此事件在HttpSession对象实例化之前激发。使用HttpRequestEnd管道无法工作,因为HttpSession对象在HttpApplication.EndRequest事件激发时已被释放。

触发PostAcquireRequestState事件后,会话变为可用。若要拦截此事件,请创建一个实现IHttpModule的类,并将其添加到Web.config中的元素中。HttpModule代码需要检查请求是否需要会话状态,因为尝试读取静态资源请求的会话将引发exc感同身受

以下是访问会话和查询字符串的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" />

回答要侦听的正确事件。

实际上,您可以在sitecore处理HttpRequest的过程中使用httpRequestProcessed,而不是httpRequestBegin或HttpRequestEnd,以便访问会话

您将能够使用前面提供的相同代码

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;
    }
}
公共类SaveQueryStringToSession:HttpRequestProcessor
{
公共覆盖无效进程(HttpRequestArgs args)
{
Assert.ArgumentNotNull((object)args,“args”);
字符串queryString=WebUtil.GetQueryString(“parm1”);

如果(queryString.Length),我怀疑这是因为Sitecore在SessionState模块之前插入了它的HttpModule,所以您在创建会话之前运行。Awesome最近一直在寻找类似的东西,以保持移动用户对“显示桌面站点”的选择很好。让我试试,然后我很乐意给你我的绿色复选标记。:)很高兴您可以在Sitecore管道处理器内执行此操作。请务必让我知道,实际上您可以使用HttpContext.current或args.context…来访问您的会话。已确认。在我的httpRequestProcessed管道处理器中,我可以访问args.HttpContext.session,并且它不是空的。值得注意的是,在渲染完成后会触发此进程ed,因此他们无法获得更新的会话信息。