【问题标题】:Dynamic connString (now stored in session, bad)动态 connString(现在存储在会话中,不好)
【发布时间】:2013-03-05 06:00:33
【问题描述】:

我正在从事一个项目,其中 connString 存储在会话变量中。问题是当用户有一段时间不在时会话会结束(有道理),从而使用户不得不再次登录以创建新连接。

用户从网络服务器上配置的 ODBC 连接列表中选择他的数据库,因此用户可以选择的不同 connString 不能存储在 web.config 中,因为用户可以根据需要添加新的。

我想知道如何解决这个问题。我应该告诉用户不要离开他的电脑超过 20 分钟,或者我可以将 connString 存储在其他地方吗?我见过网站弹出“您的会话将在 5 分钟后到期,请按确定继续使用该网站”或类似的内容。

此外,由于网站在许多用户之间共享,因此不可能制作静态变量,因此如果 user1 选择了“connString1”,而 user2 之后选择了“connString2”,那么不幸的是,user1 也将在“connString2”上运行。

希望你能帮忙:)

**

这可以是一个解决方案吗?: 我创建了一个“BasePage”,我的页面从中继承。在这个基本页面中,我创建了一个隐藏字段并将 connString 添加到加载时的 value 属性中。此外,我将对 connString 进行加密,以便用户无法看到源代码中的值。 然后,如果会话超时,我将使用隐藏字段中的值恢复会话,并且站点不会崩溃。

【问题讨论】:

    标签: asp.net session-variables


    【解决方案1】:

    您可以使用 app.config 来获取和设置配置文件。看一下这个以了解存储文件的实现。它同样容易获得设置。 ConfigurationManager doesn't save settings

    //编辑:如果您不希望用户能够看到您的连接字符串名称,那么您可以在 hidden_​​html 或 cookie 或会话 cookie 中提供另一个名称。在这个例子中,我使用了一个 cookie。这应该可以解决您的问题。

    设置cookie:

    HttpCookie myCookie = new HttpCookie("UserSettings");
    myCookie["ConnectionString"] = "MyCOnnectionValue";
    myCookie.Expires = DateTime.Now.AddDays(1d);//For one day.
    Response.Cookies.Add(myCookie);//Will store the cookie within the users browser so your code can read from it at every request.
    

    然后:

    if (Request.Cookies["UserSettings"] != null)
    {
        string userSettings;
        if (Request.Cookies["UserSettings"]["ConString"] != null)
        { userSettings = Request.Cookies["UserSettings"]["ConString"]; }
    }
    
    string connectionStringNameToUse;
    
    if(userSettings =="Connection1"){
        connectionStringNameToUse = "here you can have your name of connectionsstring";
    }etc with ypur other connectionsstrings here. 
    
    //Then use your connectionsstring here:
        using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionStringNameToUse ].ToString()))
                    {
                    cn.Open();
    
                    using (SqlCommand command = new SqlCommand
                        ("delete TBL from RatingListObjects TBL where ( TBL.TradeObject1Id = @MY_ID ) or ( TBL.TradeObject2Id = @My_ID ) ", cn))
                    {
                        command.Parameters.Add(new SqlParameter("@MY_ID", customerToRemove.TradeObjectId));
                        command.ExecuteNonQuery();
                    }
                }
    

    另一方面。我会选择将用户选择的数据库与数据库中的其他用户数据一起保存。但是,如果您只希望用户在某个时间选择由程序设置的连接字符串,这是可行的。它不会让他们看到连接字符串名称。希望这会有所帮助,祝你好运!

    【讨论】:

    • 我不确定我是否理解。这是 ASP.net,我想我这里只有一个 web.config?如果我在运行时尝试在 web.config 中添加/编辑某些内容,整个站点将重置并阻止其他用户完成他们的工作
    • @Thomas 如果你没有,你可以添加它。这是另一个问题的示例:stackoverflow.com/questions/5989736/…
    • 感谢马格努斯!你能不能看看我编辑过的帖子中的“可能的解决方案”,然后说它是否有意义
    • @Thomas 嗯...一个,imo,实现这一点的方法是使用cookie。然后,您可以根据需要将所选连接保存在用户计算机上,而不必担心用户是否有一段时间不在他/她的计算机上。我的意思是,ser 实际上并没有使用你的连接字符串,对吗?您可以只存储一个值来决定使用哪个连接字符串。还是我错过了什么?
    • 是的,是的。我也考虑过使用cookie。不同之处在于我必须 110% 确定用户启用了 cookie(某些用户可能由于某些奇怪的原因没有启用)。它是最简单的解决方案,但不确定它是否会一直有效
    【解决方案2】:

    您能否将用户的连接字符串首选项存储在他们的个人资料中,然后保留他们的个人资料? http://odetocode.com/articles/440.aspx

    您也应该能够为匿名用户执行此操作。

    顺便说一句,我不知道 Profile API 有多安全,它们应该没问题,但以防万一,您可能希望存储一个 Enum 值,然后将其映射到代码中的连接字符串。

    【讨论】:

    • 我猜这需要我有一个额外的数据库来存储用户应该连接到哪个数据库。我希望有另一个更简单的解决方案,但我会研究一下,谢谢:)
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2014-02-02
    • 2021-05-22
    相关资源
    最近更新 更多