2012-11-13 67 views
13

我試圖訪問查詢字符串參數並將其保存到Session變量。由於我正在處理的解決方案有幾個基本佈局,最簡單的方法是將其添加到管道處理程序。然而,我的代碼失敗,因爲args.Context.Session爲空:訪問HttpRequest管道中的會話

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(是的,我將添加一個空檢查。沒有必要指出這一點。)

我跑Sitecore的Sitecore.NET 6.4.1(修訂版110720)(集成.NET 2.0)

可能相關鏈接:

+1

我懷疑這是因爲Sitecore在SessionState模塊之前插入它的HttpModule,所以您在創建會話之前運行它。 – ddysart

回答

18

的HttpRequestBegin管道連入HttpApplication.BeginRequest事件, d在HttpSession對象實例化之前觸發此事件。使用HttpRequestEnd管道不起作用,因爲HttpSession對象在HttpApplication.EndRequest事件觸發時已經被釋放。

會話在PostAcquireRequestState事件觸發後變爲可用。要攔截這個,創建一個實現IHttpModule的類,並將它添加到Web.config中的<httpModules>元素中。 HttpModule代碼將需要檢查請求是否需要會話狀態,因爲試圖讀取靜態資源請求的會話會引發異常。

這裏的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管道通過一個HTTP模塊連接到ASP.NET:

<add type="Sitecore.Nexus.Web.HttpModule,Sitecore.Nexus" 
name="SitecoreHttpModule" /> 

謝謝以@ddysart爲我指出正確的方向,並this答案正確的事件來聽。

+0

真棒尋找最近這樣的事情來堅持移動用戶的選擇「顯示桌面網站」 – WickyNilliams

2

實際上,不是httpRequestBegin或HttpRequestEnd,您可以使用httpRequestProcessed在哪個sitecore處理HttpRequest,以便您可以訪問Session。

您將可以使用您之前提供的相同代碼。

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; 
    } 
} 
+0

好。讓我試試看,然後我會很高興地給你我的綠色複選標記。 :)很高興您可以在Sitecore管道處理器內部執行此操作。 –

+0

當然,讓我知道,實際上你可以通過使用HttpContext.current或args.context來訪問你的會話... –