【问题标题】:asp.net managing multiple web.config filesasp.net 管理多个 web.config 文件
【发布时间】:2009-03-29 00:09:45
【问题描述】:

谁能推荐一个管理多个 web.config 文件的好方法?

例如,我在本地机器上使用了一个名为“localWeb.config”的开发 web.config,然后将一个用于生产的 web.config 称为“prodWeb.config”。我保留了 .config 扩展名,因此没有人可以从 Web 服务器访问它们。

localWeb.config 将有一个连接字符串到开发数据库,​​而 prodWeb.config 有一个到生产数据库。

目前,我正在使用一个 postbuild 事件,它将 localWeb.config 或 prodWeb.config 的内容复制到 web.config。这很好用,但我想知道是否有人知道更好的方法。

【问题讨论】:

  • 我倾向于只有 1 个文件,但是当我更新网站时不要上传 web.config - 也许这是不好的做法,但我认为这是 Microsoft 想要你做的。如果您(或新的团队成员)不小心上传它可能会有点痛苦......

标签: asp.net visual-studio web-config


【解决方案1】:

您可以查看此 CodeCarnage page 中概述的方法是否更适合您的需求。它利用 configsource 属性指向 DB 和 APP 设置,每个设置都由环境分隔。这也许可以让您在 web.config 中保留一致的内容,并在其他配置文件中保留特定于环境的“内容”。

【讨论】:

    【解决方案2】:

    查看Web Deployment Tool

    这里只是其中的一些任务 使用工具来完成:

    1. 创建一个包含内容、配置和 SQL 的包 用于部署或共享的数据库 和其他人。

    2. 使用该软件包来对应用程序进行版本控制或创建备份。

    3. 添加参数以替换连接字符串或其他值 安装包期间的文件。

    4. 使非管理员能够部署包并精细控制其 使用权。

    5. 同步或迁移运行 IIS 6.0 和 IIS 的站点和服务器 7.0.

    【讨论】:

      【解决方案3】:

      在 asp.net 4 到达 http://www.asp.net/learn/whitepapers/aspnet40/#_Toc223325501 之前,这将继续是一个 hack

      【讨论】:

        【解决方案4】:

        我保留一个配置文件并在运行时使用逻辑来检测要使用的配置子集。如果主机名是“prodsrvr-*”,那么我使用生产服务器配置,包括数据库连接等。如果主机名是“test-*”,那么我使用测试配置数据。等等。

        编辑:这里有一些代码符合我的描述。

        public static string GetConnString()
        {
            string connString = ConfigurationSettings.AppSettings[GetConfigKey("database")];
            return connString;
        }
        
        public static string GetConfigKey(string baseKey)
        {
            string str = baseKey;
            if (Dns.GetHostName().StartsWith("dinoch"))
            {
                str = str + "-dev";
            }
            else if (Dns.GetHostName().StartsWith("prodsrvr"))
            {
                str = str + "-prod";
            }
            return str;
        }
        
        <configuration>
           <appSettings>
             <add key="database-dev" value="server=(local)\vsdotnet;database=ASPXAPPS;Integrated Security=SSPI" />
             <add key="database-prod" value="server=(local)\vsdotnet;database=ASPXAPPS;Integrated Security=SSPI" />
           </appSettings>
        </configuration>
        

        我使用了一个简单的 StartsWith() ,并带有一些硬编码的“魔术字符串”。

        为了避免这种情况,我可以想象在 web.config 文件中定义一个正则表达式映射到后缀。其中,如果 regex1 与主机名匹配,则使用 suffix1。如果是 regex2,则使用 suffix2。等等。您只需加载一次地图,然后只加载到 foreach() 中,通过正则表达式枚举并返回它们是否与主机名匹配。

        或者,也许您想使用不同的标准来区分 prod、dev 和测试服务器,而不是主机名。这取决于你。

        【讨论】:

        • 这听起来像是我可以使用的一种方法,因为它主要是为我改变的连接字符串。你能告诉我一些关于你如何/在哪里做的代码吗?
        • 只有当测试和生产主机名模式也在 web.config 中时,我才可以这样做。否则,您会在源代码中使用魔术字符串,这通常是不可以的(是的,我也有罪)。
        猜你喜欢
        • 2012-12-24
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        相关资源
        最近更新 更多