【问题标题】:web.config with app.config in .dllweb.config 与 .dll 中的 app.config
【发布时间】:2012-02-18 22:29:53
【问题描述】:

我刚刚继承了一个非常古老的 ASP.NET 2.0 Web 应用程序。

在应用程序中它有几个支持类库项目。在 DataAccess 类库中,是一个带有名为 ConnString1 的连接字符串的 app.config(和 setting.settings 文件)。

我一直认为 .DLL 不能有 app.config/setting.settings 文件(或者至少你可以包含它们但它们不会被使用),所以这让我感到困惑。

web.config 也有一个名为 ConnString1 的连接字符串,它具有相同的服务器登录凭据,但服务器名称不同。

当我从 Visual Studio DEBUG 运行应用程序时,它使用位于 app.config/settings 文件中的连接字符串,而不是 web.config/machine.config 中定义的连接字符串。

我认为 .DLL 不会这样做,而是使用 web.config 代替?

但是,当我以 RELEASE 模式将此应用程序推送到我们的生产服务器(在测试网站中)时,它似乎在 web.config 中使用了正确的连接字符串。

谁能解释一下?

【问题讨论】:

    标签: asp.net web-config


    【解决方案1】:

    一定有一些东西让您感到困惑,以为正在使用作为该 DLL 一部分的配置文件 - 而不是应用程序(入口点的)配置文件(yourapp.exe.config 或 web.config) .也许该 conn 字符串在某处被硬编码以在调试模式下使用,例如通过“#if DEBUG”预处理指令使用条件编译(因此,可以在您的解决方案中搜索“#if DEBUG”以查看是否发生了这种特殊情况)。

    MSDN article about app settings

    参见“在设计时创建应用程序设置”部分的黄色“注”:“因为没有类库的配置文件模型,所以应用程序设置不适用于类库项目。”

    【讨论】:

      【解决方案2】:

      我发现了问题:

      在上面的示例中,我使用 web.config/machine.config 来设置应用程序的连接字符串。

      如果连接字符串未在 web.config 中定义,则默认为 machine.config。如果 machine.config 中未定义连接字符串,它将使用 .dll 中的 app.config 设置。

      需要注意的是,将连接字符串放在 machine.config 中,必须在正确的 Framework/CONFIG 中定义。

      在我的开发机器上,连接字符串不是在 web.config 中而是在 environment.config 中定义的,而是在 Framework64/CONFIG 中定义的——但是,应用程序是以 32 位编译的,因此,原因用于使用没有在其中定义连接字符串并导致其默认为类库中的 app.config 的 Framework/CONFIG。

      我希望这能解释清楚吗?

      【讨论】:

      • 很高兴你找到了它。您的下一步应该是与相关人员开会,并向他们解释连接字符串不属于机器或环境配置文件。
      • 我认为这不是真的。将连接字符串放入 machine.config 意味着您可以从 dev --> test --> 生产中提升您的应用程序(及其配置文件),而无需在每一步手动修改配置。
      • 正确。我们所处的环境有 20 个不同的网站。由于列级加密,它们都使用相同的连接字符串(仅允许一次登录在数据库级别加密/解密列)。将此连接字符串放在 machine.config 中更容易,然后必须每季度在 web.config 中更改它(这是我们的安全标准所要求的)。
      • 回应 Jason,另一种处理部署时手动编辑 web.config 的方法(几年前我在另一家公司遇到过)是将 web.config 模块化。将 file="" 属性添加到配置部分,以便您可以将特定于环境的定义放在本地文件的一侧,而不是将其包含在构建包中。您可以执行 xcopy deploy 并单独保留本地工件。除非您有 20 个应用程序都需要完全相同的设置,否则我也会避免在 machine.config 中存储设置。
      【解决方案3】:

      所有配置设置必须在可执行配置文件中指定。对于 Windows 和控制台应用程序,它是 app.config,对于 Web 项目,它是 web.config。

      库可以指定配置设置,但您必须将设置复制到可执行文件的配置文件中,以便应用程序能够读取它们。

      【讨论】:

        【解决方案4】:

        Web.config、AppSettings.json 和 App.config 的区别

        Web.config:

        当您想在 IIS 上托管应用程序时,需要 Web.config。 Web.config 是 IIS 的强制配置文件,用于配置它在 Kestrel 前如何作为反向代理运行。如果你想在 IIS 上托管它,你必须维护一个 web.config。

        AppSetting.json:

        对于与 IIS 无关的所有其他内容,您可以使用 AppSetting.json。 AppSetting.json 用于 Asp.Net Core 托管。 ASP.NET Core 使用“ASPNETCORE_ENVIRONMENT”环境变量来确定当前环境。默认情况下,如果您在未设置此值的情况下运行应用程序,它将自动默认为生产环境并使用“AppSetting.production.json”文件。当您通过 Visual Studio 进行调试时,它会将环境设置为 Development,因此它使用“AppSetting.json”。请参阅此网站以了解如何在 Windows 上设置托管环境变量。

        App.config:

        App.config 是 .NET 使用的另一个配置文件,主要用于 Windows 窗体、Windows 服务、控制台应用程序和 WPF 应用程序。当您通过控制台应用程序启动 Asp.Net Core 托管时,也会使用 app.config。


        总结

        配置文件的选择取决于您为服务选择的托管环境。如果您使用 IIS 来托管您的服务,请使用 Web.config 文件。如果您使用任何其他托管环境,请使用 App.config 文件。 见Configuring Services Using Configuration Files documentation 并查看Configuration in ASP.NET Core.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-22
          • 2014-03-10
          • 2014-01-19
          • 2017-04-07
          • 2010-10-10
          • 2010-10-02
          • 2010-09-14
          相关资源
          最近更新 更多