【发布时间】:2011-01-25 13:17:26
【问题描述】:
我必须在 WCF 主机使用的 web.config 文件和 Web 客户端使用的 web.config 文件之间复制一些设置(如连接字符串)。
为了不重复,我可以让两个 web.configs 从单独的 xml 文件中读取吗?这两个 web.configs 可以完全在不同的解决方案/项目中,所以我想这是不可能的,但想得到其他人的意见。
PS:我知道我可以使用数据库来存储所有配置设置。
【问题讨论】:
我必须在 WCF 主机使用的 web.config 文件和 Web 客户端使用的 web.config 文件之间复制一些设置(如连接字符串)。
为了不重复,我可以让两个 web.configs 从单独的 xml 文件中读取吗?这两个 web.configs 可以完全在不同的解决方案/项目中,所以我想这是不可能的,但想得到其他人的意见。
PS:我知道我可以使用数据库来存储所有配置设置。
【问题讨论】:
是的,任何配置部分都可以“外部化” - 这包括<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 中包含的大部分子节。
【讨论】:
配置文件可以指向其他配置文件,只要文件在同一路径(包括子目录)。
这是我的配置设置示例:
<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 应用程序作为子文件夹。这允许每个应用程序的配置文件指向共享配置。
【讨论】:
如果可以,只需将配置放在 Machine.Config 中。它们都可以从那里读取,并且每个 web.config 都可以覆盖您需要的任何值。
我说如果可以的话,因为我知道许多托管公司不会让您修改它,除非您租用专用服务器。
【讨论】:
您可以在 web.config 之外指定连接字符串 http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx 但它必须在同一个目录中。
【讨论】: