【问题标题】:How to keep the connection string in an application variable?如何将连接字符串保存在应用程序变量中?
【发布时间】:2011-12-27 15:25:29
【问题描述】:

在登录页面中,我通过以下代码确定用户是否为管理员:

if (r.IsUserInRole(txtUserUsername.Text, "User") == true)
{
    connection = ConfigurationManager.ConnectionStrings["GameHutDBEntities1"].ToString();

    switch (new BusinessLayer.Users().ValidateLogin(txtUserUsername.Text, txtUserPassword.Text, connection))
    {
        case Helpers.LoginStatus.LoginSuccessful:
        {
            Response.Write("<Script> alert('Welcome to GameHut Admin Panel!')</Script>");
            FormsAuthentication.RedirectFromLoginPage(txtUserUsername.Text, chkRemember.Checked);
            break;
        }
        case Helpers.LoginStatus.Blocked:
        {
            Response.Write("<Script> alert('Account Blocked')</Script>");
            break;
        }
        case Helpers.LoginStatus.Invalid:
        {
            Response.Write("<Script> alert('Invalid username or password')</Script>");
            break;
        }
    }
}

在连接类中,我传递的连接字符串如下:

public class ConnectionClass
{
    public GameHutDBEntities Entities { get; set; }
    public System.Data.IDbTransaction Transaction { get; set; }

    public ConnectionClass()
    {
        this.Entities = new GameHutDBEntities();
    }

    public ConnectionClass(GameHutDBEntities _Entities)
    {
        this.Entities = _Entities;
    }

    public ConnectionClass(GameHutDBEntities _Entities, string conn)
    {
        this.Entities = _Entities;
        this.Entities.Connection.ConnectionString = conn;
    }
}

在管理员登录并重定向到另一个页面后,连接字符串丢失并且设置了默认连接字符串?只要用户注销,有人可以告诉我如何保留连接字符串。

【问题讨论】:

  • 使用缓存或会话变量。每个用户的连接字符串是否不同?如果不是,只需调用您的 ConnectionClass 并缓存您的值。
  • 你为什么要把它传给 DAL?! DAL 应该关心它,而不是业务逻辑或表示层。
  • 另外我建议用 MembershipProvider (Membership.ValidateUser()) 包装你的 UserRepository (BusinessLayer.Users)
  • 每个用户的连接字符串都不同,这是问题
  • 以不同的名称将所有内容保存在 Web.config 中。不能吗?

标签: c# asp.net .net connection-string


【解决方案1】:

那是因为你在后面的web表单代码中实例化了类,当你切换到另一个页面时,实例化的对象就丢失了,因为ASP.NET无状态。

如果您需要重用连接字符串,请将其保存在会话变量中:

Session["conn"] = "connection string";

您可以在任何地方重复使用它。

还有其他几个选项,例如缓存,或静态属性,甚至每次您想使用它时都从配置中读取它。这实际上取决于使用的上下文。

编辑:

要从配置中读取连接字符串,您可以使用System.Configuration 中的ConfigurationManager 类:

string conn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

【讨论】:

  • 会话在 DataLayer 中不可读,这是问题
  • @user1114676:这也是连接字符串不应跨越 DAL 的另一个原因。
  • 那为什么不每次使用时从 web.config 中读取呢?我已经更新了我的答案以反映使用情况。
  • 这应该仍然可行,因为类库程序集没有单独的 .config 文件。配置管理器将使用应用程序中的 web.config。这个我试过了,应该可以的。
  • 为什么表示层需要检索连接字符串? IMO,只有数据层应该知道它,因为只有数据层需要它。而数据层可以通过ConfigurationManager来获取。
【解决方案2】:

将连接字符串名称保留在数据访问层中,并在每次需要时从 Web.config 中读取(或将其缓存在本地)。

【讨论】:

  • 我每个用户角色都有一个连接字符串,并且彼此不同..
  • @user1114676:我认为您需要提出一个新问题:如何通过正在登录的用户名区分连接字符串?
  • @user1114676:如何在用户注销之前将变量保留在内存中 Bojan 已经回答:使用Session["key"]
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2013-05-09
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多