【问题标题】:How can I replace config file database links in one place in source code? (asp.net/razor)如何在源代码中的一处替换配置文件数据库链接? (asp.net/剃须刀)
【发布时间】:2013-10-09 23:12:12
【问题描述】:

我有一个 ASP.NET/Razor 3 Web 应用程序,它通过 MS EntityFramework 使用 SQL Server 数据库。

如果/当我想更改数据库连接字符串时,例如更改密码或指向不同的数据库(例如测试与实时),则需要在三个不同的 XML 配置文件中的大约七个位置替换该字符串在项目中(app.config、web.config 和 app.release.config),这是一个容易出错的痛苦。

更糟糕的是,未处理异常的默认 web 服务器行为可能包括向 web 用户显示配置文件的部分,这实际上导致 web 服务器在 web 上显示显示数据库路径和密码的行。不好。

出于这两个原因,并且因为这不是一个任何人都可以在服务器上编辑配置文件的产品(任何更改几乎,也可能是构建操作),我更愿意将数据库连接信息编译到 Web 应用程序中并从代码而不是配置文件加载,并且能够做到这一点,以便当我想更改数据库信息时,我可以在一个地方而不是七个地方进行。

我将如何实现这一目标?

【问题讨论】:

    标签: asp.net-mvc-3 razor web-config connection-string


    【解决方案1】:

    数据库连接字符串可以集中设置在 Global.asax.cs 文件中的一个位置,作为应用程序状态的一部分,然后从项目中的其他任何地方引用。

    步骤 1:将连接字符串定义为 Global.asax.cs 中的静态变量:

    namespace TestProject
    {
        // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
        // visit http://go.microsoft.com/?LinkId=9394801
    
        public class MvcApplication : System.Web.HttpApplication
        {
            public static string ConnectionString1;
            public static string ConnectionString2;
    
            protected void Application_Start()
            {
                #region Build application state for the app-specific items needed by us
                ConnectionString1 = "Server=yourserver;Database=yourdb;etc etc";
                ConnectionString2 = "Server=yourserver;Database=yourdb;etc etc";
                #endregion
    
    
                #region Code auto-generated and needed by system - do not change
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                AuthConfig.RegisterAuth();
                #endregion
            }
        }
    }
    

    第 2 步:使用项目中其他任何地方的字符串:

    string cnxStr1 = TestProject.MvcApplication.ConnectionString1;
    string cnxStr2 = TestProject.MvcApplication.ConnectionString2;
    

    (请注意,默认情况下,字符串只能从同一项目中访问。如果您需要在同一解决方案中使用任何其他项目的字符串,则需要添加对该项目的引用。)

    【讨论】:

    • 很好的答案。遗憾的是,OP 懒得奖励赏金。
    • 是的,我同意,很抱歉我无法授予赏金,因为一场重大灾难让我忘记了这个问题,而且似乎有一个截止日期 (?) 来授予赏金?我现在才开始回到这个问题上,稍后会检查一下这个和另一个答案,看看我是否能让它们工作。
    • 没问题,@Dronz!我希望事情已经解决,现在一切都恢复正常了。
    【解决方案2】:

    上面克里希纳的回答非常好。对我来说,我个人更喜欢将它们作为静态字符串放在静态类中,并在需要的地方使用它。

    【讨论】:

    • 再说一次,这不是答案。这是答案部分的评论。
    【解决方案3】:

    如果您不想将连接字符串放在全局文件中,您可以:

    1. 为连接字符串创建一个单独的 .config 文件。例如 connectionStrings.config。
    2. 创建指向此文件的硬链接或 包含此文件的文件夹,该文件夹与您的文件夹位于同一目录中 其他 application.config 和 web.config 文件。
    3. 在每个 app.config 中的 connectionStrings 元素上设置 configSource 属性或 web.config。

    从那时起,您只有一个地方来管理应用之​​间通用的连接字符串。

    硬链接的原因是 configSource 必须引用包含应用程序配置的文件夹的同一文件夹或子文件夹中的文件。

    请注意,更改连接字符串将回收所有使用它们的 Web 应用程序池。对于控制台、桌面和服务应用程序,您必须重新启动才能使更改生效。

    对于您描述的第二个问题,您可以为每个环境创建一个单独的 connectionStrings.config 文件:开发、测试、生产。使用配置转换或其他过程,您只需更新每个 connectionString 元素中的 configSource 属性即可切换环境。

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多