web-dev-qa-db-fra.com

Comment puis-je obtenir la valeur d'une variable de session dans une méthode statique?

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'`

57
ACP

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.

98
jwwishart

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.

20
Jon Skeet

Essaye ça:

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

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);
}
1
Stephen Kennedy