如何在静态方法中获取会话变量的值?
Posted
技术标签:
【中文标题】如何在静态方法中获取会话变量的值?【英文标题】:How can I get the value of a session variable inside a static method? 【发布时间】:2011-02-04 08:27:21 【问题描述】:我正在使用带有 jQuery 的 ASP.NET 页面方法....如何在 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”需要对象引用`
【问题讨论】:
像这样使用 HttpContext.Current:HttpContext.Current.Session["UserName"].ToString(); 【参考方案1】:HttpContext.Current.Session["..."]
HttpContext.Current
为您获取当前...好吧,Http Context;您可以从中访问:会话、请求、响应等
【讨论】:
HttpContext.Current 使您可以访问当前的 Http 上下文,如我刚刚所做的编辑中所述。 HttpContext.Current 属性是静态的 (msdn.microsoft.com/en-us/library/…),它很神奇,会返回当前的 HttpContext。您应该可以访问您在后面的代码等中可以访问的大部分内容。 P.S.您试图通过静态方法访问非静态属性(会话属性)......显然它(会话属性)仅存在于类的实例上!希望这能更好地解释事情吗? @Pandiya Chendur:Session
是 Page 类的实例属性,它返回一个 HttpSessionState
对象。当你写像Session["..."]
这样的东西时,这真的是this.Session["..."]
。因为静态成员没有this
对象,所以您无法访问Session
属性。但是,您可以使用 hwwishard 建议的代码访问相同的 HttpSessionState
对象。
@jwwishart:很抱歉在之前的评论中打错了你的名字。 J 和 H 紧挨着,此时房间里一片漆黑。
我们如何在静态方法中使用页面、应用程序等,【参考方案2】:
如果你没有换过线程,可以使用HttpContext.Current.Session
,如jwwisart所示。
HttpContext.Current
返回与线程关联的上下文。显然,这意味着例如,如果您启动了一个新线程,您将无法使用它。您可能还需要考虑线程敏捷性——对于整个请求,ASP.NET 请求并不总是在同一个线程上执行。我相信上下文传播得当,但要牢记这一点。
【讨论】:
SessionState 与页面方法一起使用,我相信您的担忧是无效的 Jon(除非我们自己的代码启动了一个新线程,否则我不知道会发生什么)。我会更加紧张您的无条件建议,即“理想情况下,您应该从客户那里传递您需要的所有信息”,因为这在很大程度上取决于数据的性质 - 我在野外看到了一些非常 dangerous examples !我宁愿说“这取决于”。 @StephenKennedy:我已经完全删除了最后一段,而不是花费很长时间为一个近 8 岁的答案添加细微差别。【参考方案3】:试试这个:
HttpContext.Current.Session["UserName"].ToString();
【讨论】:
【参考方案4】:您可以通过HttpContext.Current
访问当前Session
- 静态 属性,您可以通过该属性检索适用于当前Web 请求的HttpContext
实例。这是静态应用代码和静态页面方法中的常见模式。
string s = (string)HttpContext.Current.Session["UserName"];
同样的技术用于从用[WebMethod(EnableSession = true)]
修饰的ASMX Web 方法中访问Session
,因为虽然这些方法不是静态的,但它们不会从Page
继承,因此不能直接访问@987654330 @属性。
静态代码可以同样的方式访问Application Cache:
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);
【讨论】:
以上是关于如何在静态方法中获取会话变量的值?的主要内容,如果未能解决你的问题,请参考以下文章
错误 500:如何通过 Laravel 自定义配置文件获取会话变量?