Как я могу получить значение переменной сеанса внутри статического метода? - PullRequest
57 голосов
/ 05 апреля 2010

Я использую методы страницы ASP.NET с jQuery .... Как получить значение переменной сеанса внутри статического метода в C #?

protected void Page_Load(object sender, EventArgs e)
{
    Session["UserName"] = "Pandiya";
}

[WebMethod]
public static string GetName()
{
    string s = Session["UserName"].ToString();
    return s;
}

Когда я компилирую это, я получаю ошибку:

Ссылка на объект требуется для нестатического поля, метода или свойства 'System.Web.UI.Page.Session.get'`

Ответы [ 4 ]

98 голосов
/ 05 апреля 2010

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

HttpContext.Current получает вам текущий ... ну, Http Context; из которого вы можете получить доступ: сеанс, запрос, ответ и т. д.

20 голосов
/ 05 апреля 2010

Если вы не изменили нить, вы можете использовать HttpContext.Current.Session, как указано jwwishart.

HttpContext.Current возвращает контекст, связанный с потоком. Очевидно, это означает, что вы не можете использовать его, например, если вы начали новый поток. Вам может также необходимо учитывать гибкость потоков - запросы ASP.NET не всегда выполняются в одном и том же потоке для всего запроса. Я верю , что контекст распространяется надлежащим образом, но об этом следует помнить.

2 голосов
/ 11 июня 2016

Попробуйте это:

HttpContext.Current.Session["UserName"].ToString();
1 голос
/ 11 марта 2018

Вы можете получить доступ к текущему Session через HttpContext.Current - свойство static , с помощью которого вы можете получить экземпляр HttpContext, который применяется к текущему веб-запросу. Это общий шаблон в статическом коде приложения и статических методах страницы.

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

Тот же метод используется для доступа к Session из веб-методов ASMX, украшенных [WebMethod(EnableSession = true)], поскольку, хотя такие методы не являются статичными, они не наследуются от Page и, следовательно, не имеют прямого доступа к Session собственность.

Статический код может обращаться к кэшу приложений таким же образом:

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

Если статический код находится внутри другого проекта, нам нужно сослаться на System.Web.dll. Однако в этом случае обычно лучше избегать такой зависимости, потому что если код вызывается извне контекста ASP.NET, HttpContext.Current будет null по очевидным причинам. Вместо этого мы можем потребовать HttpSessionState в качестве аргумента (нам все равно понадобится ссылка на System.Web, конечно):

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

Звоните:

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