在运行时更改 web.config 连接字符串的最佳方法是什么?

2024-03-14

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

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

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


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

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

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

如果我可以在像这样声明 SQLDataSource 控件时设置连接字符串,那就很简单了:

  <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString = "<%= Session("MyConnectionString") %>"
    SelectCommand="SELECT * FROM [Customers]">
  </asp:SqlDataSource>

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

非常感谢大家的帮助!


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

首先阅读这篇文章表达构建器 http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx。我最喜欢带入我的网络应用程序的东西之一!

现在一些代码:

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

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 http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx并稍作修改)

最后将 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>

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时更改 web.config 连接字符串的最佳方法是什么? 的相关文章

  • Android 预填充数据库 [重复]

    这个问题在这里已经有答案了 我正在开发一个 Android 应用程序 需要在该应用程序的数据库中填充多个条目 一个表 包含 1000 10000 行 然后用户才能使用该应用程序 我浏览了一些教程 但不确定执行此操作的最佳方法 我是否应该在每
  • 在 Yii2 中从数据库中多态查找模型

    我在数据库 mysql 中有一张表 但该表存储了几种略有不同类型的行 类型取决于此表的type柱子 我有一个表的抽象 ActiveRecord 类和几个后代子类 它们为不同类型的同一表的行实现略有不同的逻辑 现在我正在为所有类型的行实现更新
  • 具有 Windows 身份验证的 ASP.NET Web API 自托管

    我正在尝试将 ASP NET Web API 自托管选项与 Windows 身份验证结合使用 以便我可以确定登录的用户 并最终根据用户的身份接受或拒绝用户 这是我的控制台应用程序代码 using System using System We
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 哪些控件触发了 Page.IsValid = false?

    两件事情 是否可以通过 Jquery 设置 Page IsValid Is Valid 属性 以便我不必使用 aspx 验证器 据我了解 IsValid 属性是只读的 当验证器进入时 是否可以通过 Jquery 当然 找出哪些控件导致验证失
  • 删除 cookie php

    我正在尝试创建一个带有登录系统的平台 并将用户名和密码存储在cookie中 以使用户即使关闭浏览器然后再次输入也能保持登录状态 我设法保存了cookie 但我不知道如何制作注销按钮 这是代码 function logout body app
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 密码保护 IIS 7.5 中的 ASP.NET Web 应用程序

    我在 Windows 7 上使用 IIS 7 5 为我的 asp net 网站提供测试服务 为了阻止随意的人查看我的网站 我希望 IIS 在提供任何服务之前需要用户名和密码 我已尝试在应用程序上禁用匿名身份验证并启用 Windows 身份验
  • 隔离必需的字段验证器?

    我在页面上有两个搜索按钮 一个链接到下拉列表 另一个链接到带有文本框的下拉列表以获取更多搜索条件 我在所有上述控件上都需要现场验证器 当我从第一个下拉列表中选择某些内容并单击相应的搜索按钮时 文本框的字段验证器会触发 从而禁用第一个搜索按钮
  • 用于桌面数据库应用程序的 Python 框架

    是否有一个框架可以为Python开发桌面数据库应用程序 一些带有CRUD屏幕的屏幕 我正在寻找类似于 Windows 窗体的东西 能够将 TextField Combos 和其他 UI 隐喻与datasets连接到关系数据库例如 MySQL
  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • 将 GUID 转换为整数并返回

    所以我有一个必须与之交互的第三方应用程序 该应用程序需要我的用户表中的用户ID 问题是我将我的 userID 存储为 GUID 而第 3 方应用程序仅接受整数 所以我想 如果有一种方法可以将 GUID 转换为整数 然后能够将其转换回来 当我
  • 将空查询字符串参数视为空字符串,而不使用参数类

    我正在尝试将多个参数传递给 httpget Web api 函数 我遇到的关键问题是空查询字符串参数被转换为空 我可以通过创建一个如下所示的类来解决这个问题 public class CuttingParams DisplayFormat
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • 允许匿名用户浏览样式和图像文件夹

    我正在编写一个 ASP NET Web 应用程序 我有一个登录屏幕 上面有一些 CSS 样式和图像 我遇到了样式和图像未显示的问题 我在网上阅读 它说我需要在 Content 文件夹中放置一个 web config 我将以下内容添加到 we
  • 当按下 html 键盘按钮时,将文本添加到输入字段(具有焦点的字段)

    我使用 HTML 创建了一个屏幕键盘 div and a 标签 页面上有六个文本输入 名字 昵称 姓氏 注释 过敏 手机号码 我不太擅长 JS 但如果页面上只有一个输入 我确实知道该怎么做 但我不确定当有多个输入时该怎么做 我遇到的问题之一
  • Linq 连接两个值

    假设我有一个列表 City State 它最初来自数据库 我有LocationID 但现在我将它加载到内存中 假设我还有一张快餐店表 其中记录了城市和州 我需要获取与城市和州相匹配的机构列表 注意 我尝试描述一个简化的场景 我的业务领域完全
  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 如何正确编码 mailto 链接?

    我正在生成一些 HTML 并且我想生成 XSS 和数据库内容安全的mailto关联 这里使用的正确编码是什么 这个怎么样 myLiteral Text string Format mailto 0 Content Type text htm
  • 使用 JWT 通过 Asp.net core 进行 GraphQL 身份验证

    我正在使用 NET 的 GraphQL https www nuget org packages GraphQL 2 0 0 alpha 912graphql 的包 但我无法理解如何在 graphql 查询或突变中使用 JWT 进行身份验证

随机推荐

  • 拖动按钮时 ScrollView 不滚动

    我有一个滚动视图 当它上面没有按钮时 它会滚动 现在确实如此 当拖动鼠标 在模拟器上 时 什么也没有发生 我认为是因为按钮被按下 我怎样才能做到这一点 发生这种情况是因为UIButton的子视图UIScrollView 我假设按钮在您的情况
  • 如何将原始 SQL 查询放入 Sequel 中

    我正在尝试将 SQL 代码转换为 Seqel 以从我的脚本运行它 我如何转换这个 select code count 1 as total from school districts group by code order by total
  • 从 SQL Server 中的 XML 选择空值

    我正在尝试从具有 null 作为属性之一的 XML 中进行选择 它没有返回 null 而是返回 0 我做错了什么 请参阅下面的代码进行复制 declare a xml select a
  • 将变量传递给jsp

    我有一个java类 public void doView RenderRequest renderRequest RenderResponse renderResponse throws IOException PortletExcepti
  • 使用 RxJava 进行电子邮件登录验证,可观察对象发出两次

    我正在制作一个简单的登录表单 电子邮件和密码 来尝试增强我的反应式编程技能 我在让电子邮件字段验证按照我想要的方式工作时遇到一些问题 这是我的代码 final Observable
  • 如何在 Linux 中获取文件创建日期?

    我正在处理一批文件 这些文件包含同一对象在其生命周期不同时间的信息 对它们进行排序的唯一方法是按创建日期 我正在使用这个 char buffer has the name of file struct stat buf FILE tf tf
  • select2 将类添加到所选选项

    我想添加类option在 select2 中 所以在我单击建议列表项后 它将添加自定义类添加到选择多个到主要的选择结构 这是示例代码
  • Go/Golang sql.DB 在函数中的重用

    sql Open 返回 sql DB 类型的变量 我有一个函数可以调用其他 10 个函数 这些函数都需要进行数据库调用 是否更正确 更有效 将 sql DB 指针发送到每个函数 或者 在每个函数中创建一个新的 sql DB 对象 Meani
  • 是否可以捕获 Ctrl+C 信号 (SIGINT) 并以“延迟”方式运行清理函数?

    I want to capture the Ctrl C SIGINT signal sent from the console and print out some partial run totals You can use the o
  • Swift 相当于 Ruby 的“each_cons”

    Ruby 红宝石有每个缺点 https ruby doc org core 2 1 0 Enumerable html method i each cons可以像这样使用 class Pair def initialize left rig
  • 如果枚举无法适合无符号整型,会发生什么情况?

    根据要求芭丝谢芭 https stackoverflow com users 2380830 bathsheba并作为后续问题 如果枚举不能适合整型 会发生什么 https stackoverflow com questions 39620
  • 获取时区的日期时间偏移

    我有一个代码 需要查找中欧时区与 UTC 的当前偏移量 我的代码部署在azure应用程序服务中 var offset DateTimeOffset Now Offset Hours DateTimeOffset Now Offset Min
  • 使用 Android 5.0 Activity 转换到具有 ViewPager 的 Activity 时出现问题

    因此 我们尝试创建从 ListView 中的图像到 ViewPager 图库中的图像的跨活动图像过渡 在执行此过渡时 我们看到动画在 ViewPager 完成加载 绘制之前发生 这会导致 ViewPager 上的图像闪烁 从而使动画看起来很
  • IOptionsMonitor 与 IOptionsSnapshot 之间的区别

    根据这个答案 https stackoverflow com a 46570073 1987788 IOptionsMonitor在 DI 容器中注册为单例并且能够通过以下方式检测变化OnChange事件订阅 它有一个CurrentValu
  • 带有当前时间戳的 Spring Roo 日期字段

    大多数数据库允许具有当前时间戳的字段 充当创建时间戳 例如在 MySQL 中 CREATE TABLE t ts TIMESTAMP DEFAULT CURRENT TIMESTAMP 如何在 Spring Roo 中实现这一点 找不到提示
  • 使用大量 CPU 的 Visual Studio Code

    我运行的是 Windows 10 VSCode 即使在空闲时也会占用 26 30 的 CPU 我试过code disable extensions在 CMD 中检查扩展是否导致问题 但我的性能与扩展相同 当我使用 sublime text
  • 向 UIScrollView 内的 UIImageView 添加捏合/缩放效果

    我有一个非常基本的屏幕共享iPhone应用程序 我已经使用a成功地将捏合 缩放效果添加到我的应用程序中UIImageView里面一个UIScrollView The UIImageView定期接收来自PC的屏幕内容 一切工作正常 但一旦我滚
  • Node.js - 在继续代码之前等待多个异步调用完成

    所以基本上我有一个 for 循环 其中有一个异步函数 问题是程序只是在循环后继续 我希望它等到循环中调用的所有异步函数都完成后再继续代码 在我的代码中 bar 是一个 json 数组 其中包含其他 json 数组 function writ
  • CPU密集型任务的子进程?

    所以我开始在我正在做的项目中使用node js 当客户端发出请求时 我的 node js 服务器会从另一台服务器获取 json 然后将其重新格式化为新的 json 并提供给该客户端 然而 节点服务器从其他服务器获取的 json 可能非常大
  • 在运行时更改 web.config 连接字符串的最佳方法是什么?

    我对 ASP NET 世界还很陌生 因此在想出在运行时配置连接字符串并让整个应用程序使用该连接字符串的最佳方法时遇到了一些麻烦 以下是有关我计划构建的应用程序的更多信息 应用程序使用 Forms 身份验证 而不是 Windows 身份验证