一个web.config文件能否读取外部的xml文件?

21

我需要在一个WCF主机使用的web.config文件和一个Web客户端使用的web.config文件之间复制一些设置(例如连接字符串)。

为了避免重复,我能否让两个web.config文件都从一个单独的xml文件中读取?这两个web.config文件可以完全处于不同的解决方案/项目中,所以我认为这是不可能的,但想听听其他人的意见。

顺便说一句:我知道我可以使用数据库存储所有配置设置。

4个回答

22
是的,任何配置“section”都可以被“外部化”——这包括像<appSettings><connectionStrings>等许多内容。
在您的web.config中会有这样的内容:
<configuration>
   <appSettings configSource="appSettings.config" />   
   <connectionStrings configSource="connectionStrings.config" />
   <system.web>    
      <pages configSource="pages.config" />
      <httpHandlers configSource="httphandlers.config">
   </system.web>    
</configuration>

外部化配置文件仅包含其中一个子部分:

httphandlers.config:

<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>

请注意,您不能将整个<system.web>部分外部化,因为它是一个配置节组而不是配置节,但您可以外部化包含在system.web中的大多数子部分。


httphandlers.config应该放在哪里?共享此配置文件的项目可能位于域上。 - DotnetDude
@DotnetDude:如果您不指定路径,则httpHandlers.config必须与web.config位于同一位置。您可以指定子路径,例如configSource="config\httpHandlers.config",以将所有配置文件放在一个位置。要在多个项目之间共享,请将其复制到不同的项目位置,或者在操作系统级别上执行符号链接等操作,以使一个物理文件显示在各种目录位置中。 - marc_s

12

一个配置文件可以指向其他配置文件,只要这些文件在同一个路径下(包括子目录)。

以下是我的配置设置示例:

<connectionStrings configSource="web\config\connectionStrings.config" />
<appSettings configSource="web\config\appSettings.config" />
<system.diagnostics configSource="web\config\diagnostics.config" />
<system.serviceModel>
    <bindings configSource="web\config\serviceModelBindings.config" />
    <behaviors configSource="web\config\serviceModelBehaviors.config" />
    <services configSource="web\config\serviceModelServices.config" />
    <client configSource="web\config\serviceModelClient.config" />
</system.serviceModel>
在我的情况下,我有几个Windows应用程序在一个根目录中,其中包括一个Web应用程序作为子文件夹。这样可以让每个应用程序的配置文件指向共享的配置信息。

运行时和system.web.extensions部分与configSource不兼容? - Kiquenet

1
如果可以的话,只需将配置放在Machine.Config中。它们都可以从那里读取,每个web.config都可以覆盖您需要的任何值。
我说如果可以的话,因为我知道许多托管公司不允许您修改它,除非您租用了专用服务器。

1

不,不必在同一目录下。您可以轻松地编写:<connectionStrings configSource="config\prod\connectionStrings.config" />。完全没有问题。 - marc_s
然后他就开始了。将其放入单独的文件中,并在不同应用程序的web.config之间共享它! - ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接