C# 如何在静态方法中获取会话变量的值?

C# 如何在静态方法中获取会话变量的值?,c#,asp.net,methods,static,session-variables,C#,Asp.net,Methods,Static,Session Variables,我正在使用ASP.NET页面方法与jQuery。。。。如何在C#中的静态方法中获取会话变量的值 当我编译此文件时,会出现以下错误: 非静态字段、方法或属性“System.Web.UI.Page.Session.get”需要对象引用` HttpContext.Current.Session[“…”] HttpContext.Current获取当前。。。那么Http上下文,;您可以从中访问:会话、请求、响应等如果您没有更改线程,您可以使用HttpContext.Current.Session,如jw

我正在使用ASP.NET页面方法与jQuery。。。。如何在C#中的静态方法中获取会话变量的值

当我编译此文件时,会出现以下错误:

非静态字段、方法或属性“System.Web.UI.Page.Session.get”需要对象引用`


HttpContext.Current.Session[“…”]


HttpContext.Current
获取当前。。。那么Http上下文,;您可以从中访问:会话、请求、响应等如果您没有更改线程,您可以使用
HttpContext.Current.Session
,如jwvishart所示

HttpContext.Current
返回与线程关联的上下文。很明显,这意味着你不能使用它,如果你已经开始了一个新的线程,例如。您可能还需要考虑线程灵活性——ASP.NET请求不总是在同一线程上执行整个请求。我相信上下文的传播是恰当的,但要记住这一点。

试试以下方法:

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

您可以通过-一个静态属性访问当前的
会话
,通过该属性可以检索应用于当前web请求的
HttpContext
实例。这是静态应用程序代码和静态页面方法中的常见模式

string s = (string)HttpContext.Current.Session["UserName"];
同样的技术也用于从用
[WebMethod(EnableSession=true)]
修饰的ASMX web方法中访问
会话
,因为虽然这些方法不是静态的,但它们不会从
页面
继承,因此不能直接访问
会话
属性

静态代码可以以相同的方式访问:

string var1 = (string)HttpContext.Current.Cache["Var1"];
如果静态代码在另一个项目中,我们需要引用
System.Web.dll
。但是,在这种情况下,通常最好避免这种依赖关系,因为如果代码是从ASP.NET上下文外部调用的
HttpContext.Current
null
,原因显而易见。相反,我们可以要求一个
HttpSessionState
作为参数(当然,我们仍然需要对
System.Web
的引用):

电话:


Current允许您访问当前Http上下文,正如我刚才所做的编辑中所解释的。Current属性是static(),它的作用很神奇,并返回当前的HttpContext。你应该可以访问代码隐藏中的大部分内容。您试图通过静态方法访问非静态属性(会话属性)。。。显然,它(会话属性)只存在于类的实例上!希望这能更好地解释问题?@Pandiya Chendur:
Session
是返回
HttpSessionState
对象的Page类的实例属性。当您编写类似于
Session[“…”]
的内容时,这实际上就是
this.Session[“…”]
。由于静态成员没有
对象,因此无法访问
会话
属性。但是,您可以使用hwwishart建议的代码访问相同的
HttpSessionState
对象。@jwvishart:很抱歉在前面的评论中键入了您的名字。J和H紧靠在一起,此时房间里一片漆黑。如何在静态方法中使用页面、应用程序等,请使用HttpContext.Current,如下所示:HttpContext.Current.Session[“UserName”].ToString();SessionState使用页面方法,我相信您的担心是无效的Jon(除非一个新线程是由我们自己的代码启动的,我不知道接下来会发生什么)。我更担心的是,你的无保留建议“理想情况下,你应该从客户那里传递你需要的所有信息”,因为这在很大程度上取决于数据的性质——我在野外看到了一些非常有用的信息!我宁愿说“这要看情况而定”。@StephenKennedy:我完全删除了最后一段,而不是花很多时间为一个将近8年的答案添加细微差别。
string var1 = (string)HttpContext.Current.Cache["Var1"];
public static class SomeLibraryClass
{
    public static string SomeLibraryFunction(HttpSessionState session)
    {
       ...
    }
}
[WebMethod]
public static string GetName()
{
    return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session);
}