【问题标题】:Access session in class library.访问类库中的会话。
【发布时间】:2012-08-09 11:27:16
【问题描述】:

我正在开发一个使用 2 个子项目的应用程序架构: a) asp.net web 应用程序(它涵盖了用户界面和业务逻辑)和 b) 类库。 (它涵盖了数据访问层)

系统用户登录成功后,用户信息保存在会话对象中。

我面临的问题是,当我尝试在类库项目(数据访问层)中访问该会话对象时,它总是返回 null。

我需要访问类库项目中的会话对象,因为在我的例子中,每个用户都有自己的数据库访问用户名和密码(出于安全原因);

那么,我如何在类库项目中读写会话对象

【问题讨论】:

  • 你根本做不到,唯一的办法就是通过web项目调用类库的特定方法,并将会话的值传递给该方法。
  • 如果这个应用程序有很多用户,我会重新考虑为每个用户设置数据库登录。您可以通过这种方式禁用连接池。
  • 我也遇到了同样的问题,Bikash,你找到解决方案了吗?

标签: c# asp.net


【解决方案1】:

使用System.Web.HttpContext.Current.Session 对象。

【讨论】:

  • 它只提供对会话对象的引用。会话对象值始终为空
  • 您无法从此处获取当前会话值。你只得到一个参考
【解决方案2】:

首先,正如 Peri 正确注意到的那样 - 您需要重新考虑是否为每个用户设置单独的数据库登录是一个好主意 - 因为您松散了连接池(不同的用户将无法重用现有连接 - 并创建一个新的 sql 连接是相当昂贵的)。

如果您真的希望保留单独的数据库用户,我会创建接口以从数据访问中抽象会话:

public interface ILoginDataService
{
   LoginData Current { get; }
}

并且实现会从会话中传递登录数据。这样,您的数据访问逻辑中的会话就不会依赖会话 - 因此它会更易于测试,您也可以分离关注点。

【讨论】:

  • 我正在尝试做类似的事情,因为我有我的多客户端数据库,每个表都有一个 ClientID,所以我所做的每个查询都必须按 ClientID 过滤。我怎样才能以一种不必在每个方法调用中都传递它的方式使用这个接口?
  • 通常使用依赖注入容器。
【解决方案3】:

这是我在库中用于获取会话信息的代码。

public static string Entity()
{
    string entity = "";
    HttpContext httpContext = HttpContext.Current;
    if (httpContext.ApplicationInstance.Session.Count > 0)
        entity = httpContext.ApplicationInstance.Session["EntityCode"].ToString();

    return entity;
}

【讨论】:

  • 它总是显示“会话状态在此上下文中不可用。”
【解决方案4】:

我有一个使用会话的 ASP.Net 应用程序。我可以使用 [WebMethod(EnableSession = true)] 函数在我的 app_code 文件中访问它。我不确定这是否是您的问题。当我在方法上删除 (EnableSession = true) 时,我还面临会话值为 null。

【讨论】:

    【解决方案5】:

    using System.Web;
    
    namespace ClassNameSpace
    {
        public class Class1 : IRequiresSessionState
        {
                private string sessionValue => HttpContext.Current.Session["sessionKey"].ToString();
        }
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多