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

Posted

技术标签:

【中文标题】如何在静态方法中获取会话变量的值?【英文标题】:How can I get the value of a session variable inside a static method? 【发布时间】:2011-02-04 08:27:21 【问题描述】:

我正在使用带有 jQ​​uery 的 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);

【讨论】:

以上是关于如何在静态方法中获取会话变量的值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中,如何访问域类静态方法中的休眠会话?

java中静态变量和静态方法的优缺点

错误 500:如何通过 Laravel 自定义配置文件获取会话变量?

java基础(static---静态方法和静态变量以及静态方法)

无法在静态方法中从 application.yml 获取值

新手请教C#中关于静态函数和静态变量