configSource在system.serviceModel或其子部分中无法工作

36

我正在尝试将一个app.config文件拆分成多个文件,以便更轻松地管理不同环境所需的差异。对于一些部分来说这很容易...

<system.diagnostics>
    various stuff
</system.diagnostics>

成为

<system.diagnostics configSource="ConfigFiles\system.diagnostics.dev" />

将“各种内容”移到system.diagnostics.dev文件中。

但对于system.serviceModel部分似乎不起作用。

现在我已经阅读到有建议说它对system.serviceModel本身不起作用,但对其下面的部分起作用:bindingsclientdiagnostics等。但当我尝试使用configSource其中之一时,同样的情况也发生在我身上。当我输入

<system.serviceModel>
  <bindings configSource="ConfigFiles\whateverFile.dev" />

我遇到了以下错误:

'configSource' 属性未声明。

还有其他人遇到过这个问题吗?你知道解决方法吗?(也许我的模式(schema)已经过时或者什么的?)


1
这里可以工作 - 我们每天都在生产中使用它。虽然在 Visual Studio 编辑器中没有显示和支持,但在运行时它是有效的! - marc_s
问题1:你尝试过将外部文件命名为*.config扩展名了吗? 问题2:你能给我们展示一个外部配置文件吗? - marc_s
3个回答

71

Visual Studio .NET的编辑器对配置文件有些抱怨,但它仍然能正常工作。

我的配置文件像这样...

<system.serviceModel>
  <behaviors configSource="config\system.servicemodel.behaviors.config" />
  <bindings configSource="config\system.servicemodel.bindings.config" />
  <client configSource="config\system.servicemodel.client.config" />
</system.serviceModel>

...这个方法可以正常工作。


1
没错,你是对的。我现在明白了,当编辑配置时它会抱怨,但运行应用程序时实际上是有效的。 - Ryan Lundy
1
啊,我明白了 - 它确实起作用了。不得不说:我早就这么说了 :-) - marc_s
1
我刚刚尝试了一下,发现configSource适用于<client>元素,但不适用于单独的<endpoint>元素。 - Adam Pope
扩展和服务也可以工作: <behaviors configSource="WCFBehaviors.config"> </behaviors> - granadaCoder
3
我意识到我来晚了,但我必须将“输出目录中的复制”设置为每个配置文件的“始终复制”,才能使已接受的解决方案正常工作。希望这有所帮助。 - Andrea Scarcella
有人知道如何抑制警告“不允许使用'configsource'属性”吗? - realbart

24

由于<system.serviceModel>是一个配置SectionGroup而不是一个配置Section,所以它将不会起作用。

在运行时,对于任何低于<system.serviceModel>的内容,它将完美地工作-我们经常使用这种方式。 Martin的答案很好地展示了这一点-他的示例将可以工作。


如果它可以在<system.serviceModel>以下的任何东西上运行,那么为什么它不能在<system.serviceModel>以下的任何东西上工作呢?我已经在很多地方读到过它“会”工作。但是它不工作。因此有这个问题。 - Ryan Lundy
所以你真正的意思是,无论我喜不喜欢,我都会收到错误消息,但我应该忽略它,然后它就会自动工作? - Ryan Lundy
不,我的意思是这里发生了一些奇怪的事情,因为“在我的电脑上可以工作” :-) 你在使用哪个版本的.NET? - marc_s

8

当将配置文件分离到单独的文件中时,需要注意一件事情:确保您分离的配置文件中不包含configSource属性。例如,如果您将绑定部分拆分如下:

<system.serviceModel>
    <bindings configSource="yourConfigFile.config" />
</system.serviceModel>

请确保您的实际绑定文件不包含“configSource”属性:

<?xml version="1.0" encoding="utf-8"?>
<bindings>
    <!-- binding configuration stuff -->
</bindings>

我知道这看起来很明显,但如果你输入了configSource属性,然后剪切并粘贴到一个新文件中,很容易忘记删除该属性。

希望这可以帮到你。


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