Come posso ottenere il valore di una variabile di sessione all’interno di un metodo statico?

Sto usando i metodi di pagina ASP.NET con jQuery …. Come posso ottenere il valore di una variabile di sessione all’interno di un metodo statico in C #?

protected void Page_Load(object sender, EventArgs e) { Session["UserName"] = "Pandiya"; } [WebMethod] public static string GetName() { string s = Session["UserName"].ToString(); return s; } 

Quando compilo, ottengo l’errore:

È richiesto un riferimento a un object per il campo, il metodo o la proprietà non statici “System.Web.UI.Page.Session.get”.

    HttpContext.Current.Session["..."]

    HttpContext.Current ti HttpContext.Current il corrente … bene, Http Context; da cui è ansible accedere: sessione, richiesta, risposta ecc

    Se non hai cambiato thread, puoi usare HttpContext.Current.Session , come indicato da jwwishart.

    HttpContext.Current restituisce il contesto associato alla discussione. Ovviamente questo significa che non puoi usarlo se hai iniziato una nuova discussione, per esempio. Potrebbe inoltre essere necessario considerare l’agilità del thread: le richieste ASP.NET non vengono sempre eseguite sullo stesso thread per l’intera richiesta. Credo che il contesto sia propagato in modo appropriato, ma è qualcosa da tenere a mente.

    Prova questo:

     HttpContext.Current.Session["UserName"].ToString(); 

    È ansible accedere alla Session corrente tramite HttpContext.Current , una proprietà statica tramite la quale è ansible recuperare l’istanza HttpContext che si applica alla richiesta Web corrente. Questo è un modello comune nel codice di app statico e nei metodi di pagina statici.

     string s = (string)HttpContext.Current.Session["UserName"]; 

    La stessa tecnica viene utilizzata per accedere alla Session dai metodi web ASMX decorati con [WebMethod(EnableSession = true)] perché mentre tali metodi non sono statici non ereditano da Page e quindi non hanno accesso diretto a una proprietà Session .

    Il codice statico può accedere alla cache dell’applicazione allo stesso modo:

     string var1 = (string)HttpContext.Current.Cache["Var1"]; 

    Se il codice statico si trova all’interno di un altro progetto, dobbiamo fare riferimento a System.Web.dll . Tuttavia, in questo caso, in genere è meglio evitare tale dipendenza perché se il codice viene richiamato da un contesto ASP.NET, HttpContext.Current sarà null , per ovvi motivi. Invece, possiamo richiedere un HttpSessionState come argomento (avremo comunque bisogno del riferimento a System.Web ovviamente):

     public static class SomeLibraryClass { public static string SomeLibraryFunction(HttpSessionState session) { ... } } 

    Chiamata:

     [WebMethod] public static string GetName() { return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session); }