【问题标题】:How to access the same session from different places?如何从不同的地方访问同一个会话?
【发布时间】:2011-05-10 09:20:50
【问题描述】:

我有一个正在使用的视图

Session["Something"] = 1;

我在一个类库项目中有一个类,它试图从会话中获取这个值

HttpContext.Current.Session["Something"]

但它会返回null

public ActionResult Index()
{
    Session["Something"] = 1;
    var fromLib = (new MyLibClass()).GetSession("Something"); // null
    var fromHere = Session["Something"]; // 1
}

// Class library project
public object GetSession(string key)
{
    return HttpContext.Current.Session[key];
}

如何从会话中获取价值?或者有没有办法保存一个值并在另一个地方检索(没有数据库或系统文件)

【问题讨论】:

  • 请问GetSession() 的实际意义是什么?如果您可以直接从HttpContext.Current.Session() 访问,则无需自定义方法来访问它。
  • @rockin 重点是用一个非常简单的例子来说明问题所在。
  • 在 Web 应用程序之外使用 session 是不好的做法,主要是因为它使单元测试变得非常困难。如果这只是一个示例,请考虑说明您实际尝试执行的操作,以便我们提出替代方案,例如在您的类库中缓存,或将“会话”逻辑移动到 Web 层的某个位置。
  • @RPM 当我使用 oAuth 登录 Facebook/Twitter 时,我将令牌存储在会话中,并创建了一个属性来访问会话并返回令牌。你有替代方案吗?对于 Twitter,我可以保存在数据库中,因为它永不过期,但对于 Facebook,我需要存储在会话或 cookie 中,我猜...
  • 这很有趣。我也在使用 Facebook OAuth 并存储令牌。但是我使用cookies(因为我有一些需要访问它的客户端东西)。但诀窍是,此代码在 Web 应用程序的操作过滤器中。没有类库。我使用 Facebook C# SDK,但将令牌存储在 cookie 中的代码是一种处理 PostAuthorize URL(Oauth 交换)的操作方法。你不能这样做吗?由于 session/cookies 对于 http 上下文是静态的,因此在您的 Web 应用程序中创建一个公共静态类,该类具有用于令牌的 getter/setter。为什么它需要在你的类库中?

标签: c# asp.net asp.net-mvc session


【解决方案1】:

您不需要Session 对象。

虽然Session 非常适合在 asp.net 应用程序中保存变量,但您可以实现自己的会话对象,以便在您的类库中使用,它轻巧快速并且在您的代码内部:

Dictionary<string, object> MySession = new Dictionary<string, object>();
MySession.Add("VariableName", myObject);
MyLib.Pass(MySession);

如果可能,请尽量保持更具体,即如果您只是将 MyClass 传递给您的库,那么:

Dictionary<string, MyClass> MySession = new Dictionary<string, MyClass>();

【讨论】:

  • 但是如何在 Web 应用程序和类库之间共享它呢?你公开吗?线程安全呢?
  • 在 Web 应用程序中,您应该继续使用会话对象作为容器,但在将参数传递给您的库时,请使用您自己的。您需要更改库的某些行以识别此数据容器。如果您需要使其线程安全,请在更改和迭代它时使用内部Dictionary 周围的锁。
【解决方案2】:

有两个会话

Session (refers to the view session)
HttpContext.Current.Session (refers to context session)

在任何地方使用HttpContext.Current.Session 都是一样的。我创建了一个类来帮助我以我想要的方式访问会话值,所以我可以调用它而不用担心正确的会话。

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多