我是 ASP.NET 世界的新手,所以我在想出在运行时配置连接字符串并让整个应用程序使用该连接字符串的最佳方法时遇到了一些麻烦。以下是有关我计划构建的应用程序的更多信息:

  • 应用程序使用表单例份验证,而不是 Windows 身份验证
  • 会有一个登录页面,用户可以在其中提供他们的 SQL Server 登录 ID 和密码
  • 为简单起见,我希望所有 SQLDataSource 控件都指向 web.config 连接字符串。这将在设计时完成,而不是以编程方式设置它们。所以,他们会有这样的属性:
    ConnectionString=""
  • 我想找到一种在运行时更改“MyDB”连接字符串的方法,以便它使用用户提供的登录 ID 和密码。但我不希望将其保存到 web.config。它应该只在该用户的 session 中处于事件状态。

  • 人们通常这样做的“标准”方式是什么?我假设一种方法是使用连接字符串创建一个 Session 变量,然后在页面加载期间以编程方式更改每个 SQLDataSource 控件的 ConnectionString 属性。但如果可能的话,我希望避免这种情况。

    由于很多人问我为什么要为每个用户使用唯一的连接并担心缺乏池化,我想我会在这里评论而不是评论每个单独的响应。

    此应用程序的性质要求每个用户都使用自己的帐户连接到数据库。后端安全与其用户帐户相关联,因此我们不能使用“用户”和“管理员”等通用帐户。我们还需要知道每个用户的具体身份以进行审计控制。该应用程序通常只有 10 到 20 个用户,因此不需要池化。我们可以再讨论这种方法的优点,但不幸的是我在这里没有选择 - 该项目要求每个用户都以自己的帐户连接到数据库。

    我希望需要 Windows 身份验证,但不幸的是,此应用程序的某些实现将需要 SQL 身份验证。

    如果我可以在像这样声明 SQLDataSource 控件时设置连接字符串,那就很容易了:
      <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString = "<%= Session("MyConnectionString") %>"
        SelectCommand="SELECT * FROM [Customers]">
      </asp:SqlDataSource>
    

    但是我收到一个错误,因为它不喜欢那里的 标签。如果我在声明控件时无法执行此操作,那么对应用程序中的每个 SQLDataSource 控件以编程方式执行此操作的最简单方法是什么?

    非常感谢大家的帮助!

    最佳答案

    如果您不想深入研究背后的代码,还有另一种方法可以做到这一点。

    首先阅读关于 expression builders 的这篇文章。我最喜欢带入我的网络应用程序的东西之一!

    现在看一些代码:

    首先在您的项目中创建一个包含以下内容的类:

    using System;
    using System.CodeDom;
    using System.Web.UI;
    using System.Web.Compilation;
    
    namespace MyNamespace.Web.Compilation
    {
        [ExpressionPrefix("code")]
        public class CodeExpressionBuilder : ExpressionBuilder
        {
            public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
               object parsedData, ExpressionBuilderContext context)
            {
                return new CodeSnippetExpression(entry.Expression);
            }
        }
    
    }
    

    然后,在 web.config 中注册表达式生成器如下
    ...
    <compilation debug="false">
      <expressionBuilders>
        <add expressionPrefix="Code" type="MyNamespace.Web.Compilation.CodeExpressionBuilder"/>
      </expressionBuilders>
    </compilation>
    ...
    

    (以上所有代码均取自 here 并稍作修改)

    最后将您的 SqlDataSource 更改为以下 (C#):
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString='<%$ code: (string)Session["MyConnectionString"] ?? ConfigurationManageer.ConnectionStrings["myDefaultConn"].ConnectionString %>'
        SelectCommand="SELECT * FROM [Customers]">
    </asp:SqlDataSource>
    

    如果你想(我会推荐)创建一个静态类来处理你的连接字符串,比如:
    public static ConnectionManager
    {
       public static string GetConnectionString()
       {
          return HttpContext.Current.Session["MyConnectionString"] as string ??
                 ConfigurationManager.ConnectionStrings["DefaultConnectionStr"].ConnectionString;
       }
    }
    

    那么你的 SqlDataSource 将是
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString='<%$ code: ConnectionManager.GetConnectionString() %>'
        SelectCommand="SELECT * FROM [Customers]">
    </asp:SqlDataSource>
    

    这样,如果您需要更改获取连接字符串的方式,您可以在一个地方完成!

    关于asp.net - 在运行时更改 web.config 连接字符串的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/627866/

    10-10 08:53
    查看更多