我构建了一个 Web 应用程序,其中包含一个 WCF 服务协定和一个调用该 WCF 服务的 Silverlight 控件。在我的开发和测试服务器上,它运行良好。
当我部署到我们的实时服务器并运行应用程序时,我得到一个类型的异常System.ServiceModel.ServiceActivationException,指出由于编译过程中的异常而无法激活服务。例外是:
System.ServiceModel.ServiceActivationException
这个集合已经包含一个带有 http 方案的地址。此集合中的每个方案最多可以有一个地址。
我读到如果网站有多个主机标头,则可能会引发此异常,这在我们的实时服务器上是正确的。显然,托管在 IIS 中的 WCF 服务只能有一个基地址。我该如何解决这个问题?
概括,
代码解决方案: 这里
配置解决方案: 这里
在Mike Chaliy的帮助下,我找到了一些关于如何通过代码执行此操作的解决方案。因为这个问题将影响我们部署到实时环境的几乎所有项目,所以我坚持使用纯粹的配置解决方案。我最终找到了一个详细说明如何在 .net 3.0 和 .net 3.5 中执行此操作的内容。
取自该站点,以下是如何更改应用程序 Web 配置的示例:
<system.serviceModel> <serviceHostingEnvironment> <baseAddressPrefixFilters> <add prefix="net.tcp://payroll.myorg.com:8000"/> <add prefix="http://shipping.myorg.com:9000"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> </system.serviceModel>
在上面的示例中,net.tcp://payroll.myorg.com:8000 和 http://shipping.myorg.com:9000是它们各自方案的唯一基地址,它们将被允许通过。baseAddressPrefixFilter 不支持任何通配符。 IIS 提供的 baseAddresses 可能具有绑定到 baseAddressPrefixFilter 列表中不存在的其他方案的地址。这些地址不会被过滤掉。
在上面的示例中,net.tcp://payroll.myorg.com:8000 和 http://shipping.myorg.com:9000是它们各自方案的唯一基地址,它们将被允许通过。baseAddressPrefixFilter 不支持任何通配符。
IIS 提供的 baseAddresses 可能具有绑定到 baseAddressPrefixFilter 列表中不存在的其他方案的地址。这些地址不会被过滤掉。
Dns 解决方案(未经测试): 我认为,如果您创建一个特定于您的 Web 应用程序的新 dns 条目,添加一个新网站,并为其提供与 dns 条目匹配的单个主机标头,您将完全缓解此问题,并且不会必须编写自定义代码或为您的 web.config 文件添加前缀。