J'utilise des méthodes de page ASP.NET avec jQuery .... Comment puis-je obtenir la valeur d'une variable de session dans une méthode statique en C #?
protected void Page_Load(object sender, EventArgs e)
{
Session["UserName"] = "Pandiya";
}
[WebMethod]
public static string GetName()
{
string s = Session["UserName"].ToString();
return s;
}
Lorsque je compile cela, j'obtiens l'erreur:
Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'System.Web.UI.Page.Session.get'`
HttpContext.Current.Session["..."]
HttpContext.Current
vous donne le courant ... enfin, le contexte Http; à partir de laquelle vous pouvez accéder: Session, demande, réponse, etc.
Si vous n'avez pas changé de fil, vous pouvez utiliser HttpContext.Current.Session
, comme indiqué par jwwishart.
HttpContext.Current
renvoie le contexte associé au thread. Évidemment, cela signifie que vous ne pouvez pas l'utiliser si vous avez commencé un nouveau thread, par exemple. Vous pouvez devez également tenir compte de l'agilité des threads - les requêtes ASP.NET ne s'exécutent pas toujours sur le même thread pour l'ensemble de la requête. Je crois que le contexte est propagé de manière appropriée, mais c'est quelque chose à garder à l'esprit.
Essaye ça:
HttpContext.Current.Session["UserName"].ToString();
Vous pouvez accéder à la Session
actuelle via HttpContext.Current
- une propriété statique à travers laquelle vous peut récupérer l'instance HttpContext
qui s'applique à la demande Web actuelle. Il s'agit d'un modèle courant dans le code d'application statique et les méthodes de page statique.
string s = (string)HttpContext.Current.Session["UserName"];
La même technique est utilisée pour accéder aux Session
à partir des méthodes web ASMX décorées de [WebMethod(EnableSession = true)]
car bien que ces méthodes ne soient pas statiques, elles n'héritent pas de Page
et donc ne avoir un accès direct à une propriété Session
.
Le code statique peut accéder à Application Cache de la même manière:
string var1 = (string)HttpContext.Current.Cache["Var1"];
Si le code statique se trouve dans un autre projet, nous devons référencer System.Web.dll
. Cependant, dans ce cas, il est généralement préférable d'éviter une telle dépendance car si le code est appelé depuis l'extérieur d'un contexte ASP.NET HttpContext.Current
sera null
, pour des raisons évidentes. Au lieu de cela, nous pouvons exiger un HttpSessionState
comme argument (nous aurons toujours besoin de la référence à System.Web
):
public static class SomeLibraryClass
{
public static string SomeLibraryFunction(HttpSessionState session)
{
...
}
}
Appel:
[WebMethod]
public static string GetName()
{
return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session);
}