2012-11-13 3 views
13

Sto tentando di accedere a un parametro stringa di query e di salvarlo in una variabile Session. Poiché la soluzione su cui sto lavorando ha diversi layout di base, l'approccio più semplice sarebbe quello di aggiungerlo a un gestore di pipeline. Tuttavia, il mio codice sta fallendo perché args.Context.Session è nullo:Accesso alla sessione nelle pipeline 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; 
    } 
} 

Ciò si verifica quando questo metodo viene inserito in entrambi la HttpRequestBegin o HttpRequestEnd pipeline. Curioso di sapere perché e se esiste una soluzione o un modello standard da utilizzare qui. (Sì, vorrei aggiungere un controllo di nulla. Non c'è bisogno di sottolineare che.)

Io corro Sitecore Sitecore.NET 6.4.1 (rev. 110.720) su IIS 7.5 (Integrated Net 2.0)

link Possibilmente rilevanti:

+1

Sospetto che sia perché Sitecore inserisce HttpModule davanti al modulo SessionState, quindi si sta eseguendo prima della creazione della sessione. – ddysart

risposta

18

il gasdotto HttpRequestBegin è cablato fino alla manifestazione HttpApplication.BeginRequest, un d questo evento viene attivato prima che l'oggetto HttpSession sia stato istanziato. L'utilizzo della pipeline HttpRequestEnd non funziona perché l'oggetto HttpSession è già stato eliminato dal momento in cui viene attivato l'evento HttpApplication.EndRequest.

La sessione diventa disponibile dopo l'attivazione dell'evento PostAcquireRequestState. Per intercettarlo, creare una classe che implementa IHttpModule e aggiungerla all'elemento <httpModules> in Web.config. Il codice HttpModule dovrà verificare se la richiesta richiede lo stato di sessione, poiché il tentativo di leggere la sessione per una richiesta di risorsa statica genererà un'eccezione.

Ecco modulo Http codice che accede alla sessione e QueryString:

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

Vale la pena notare che Sitecore HttpRequestBegin e HttpRequestEnd condutture sono cablati per ASP.NET tramite un modulo Http:

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

Grazie a @ddysart per avermi indicato nella giusta direzione e alla risposta this per l'evento corretto da ascoltare.

+0

Impressionante stava cercando qualcosa di simile a questo recentemente per la scelta persistente dell'utente mobile di "show desktop site" – WickyNilliams

2

In realtà anziché httpRequestBegin o HttpRequestEnd è possibile utilizzare httpRequestProcessed durante il quale sitecore elabora HttpRequest in modo da poter accedere alla Session.

Sarete in grado di utilizzare lo stesso codice che avete fornito in precedenza.

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

Nice. Fammi provare, e poi ti darò volentieri il mio segno di spunta verde. :) Bello che puoi farlo all'interno dei processori di pipeline Sitecore. –

+0

Certo fammi sapere, in realtà puoi accedere alla tua sessione usando HttpContext.current o args.context ... –