WCF 服务启动错误“此集合已包含具有方案 http 的地址”

我构建了一个包含 WCF 服务契约和 Silverlight 控件的 Web 应用程序,Silverlight 控件调用该 WCF 服务。在我的开发和测试服务器上,它工作得很好。

当我部署到活动服务器并运行应用程序时,我得到一个 System.ServiceModel.ServiceActivationException类型的异常,该异常指出由于编译期间的异常而无法激活服务。唯一的例外是:

此集合已包含具有方案 http 的地址。在这个集合中,每个方案最多只能有一个地址。

我读到这个异常可能会被抛出,如果网站有一个以上的主机头,这是真实的在我们的现场服务器。显然,驻留在 IIS 中的 WCF 服务只能有一个基地址。我怎样才能避开这个问题呢?

166184 次浏览

你看到了吗

您可以通过更改 web.config 文件来解决这个错误。

使用 ASP.NET 4.0,在 web.config 中添加以下代码行:

<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

使用 ASP.NET 2.0/3.0/3.5,在 web.config 中添加以下代码行:

<system.serviceModel>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://www.YourHostedDomainName.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>

总结,

代码解决方案: 给你

配置解决方案: 给你

Mike Chaliy的帮助下,我找到了一些如何通过代码实现这一点的解决方案。因为这个问题几乎会影响我们部署到一个纯配置解决方案的实时环境中的所有项目。我最终找到了一个详细的如何做到这一点。3.0及。净收入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>

在上面的例子中, 网址:// payroll.myorg.com : 8000及 Http://shipping.myorg.com:9000 只有基地址 计划 允许通过 BaseAddressPrefixFilter 没有 支持任何通配符。

IIS 提供的 baseAddress 可以 有与其他计划相连的地址 不存在于 baseAddressPrefixFilter 中 名单。这些地址将不会是 过滤掉了。

Dns 溶液(未经测试) : 我认为,如果你为你的 web 应用创建一个新的 dns 条目,添加一个新的网站,并给它一个单一的主机头匹配 dns 条目,你会减轻这个问题,而不必编写自定义代码或添加前缀到你的 web.config 文件。

在.Net 4中,您可以使用 multipleSiteBindingsEnabled选项:

<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
</system.serviceModel>

然后,您就不必指定每个地址了。

Http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

在我的案例中,这个问题的根本原因是在父网站上定义的多个 http 绑定,即 InetMgr-> Sites-> Mysite-> properties-> EditBindings。我删除了一个不需要的 http 绑定,问题得到了解决。

在我的例子中,它很简单: 我在 Visual Studio 中使用了“ Add WCF Service”向导,它会自动在 app.config 中创建相应的节。然后我继续读 如何: 在托管应用程序中承载 WCF 服务。问题是: 我不需要指定 URL 来运行 Web 服务。

更换:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

配合:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

错误消失了。

通用思想: 如果以参数 还有的形式提供基地址,在配置中指定它,就会得到这个错误。很可能,这不是唯一的方法得到的错误,你。

我有这个问题,而原因是相当愚蠢的。我正在尝试微软关于在命令行可执行文件中从 w/运行 ServiceHost 的演示。我按照说明进行操作,包括添加适当的服务(和接口)的位置。但是我得到了上面的错误。

原来,当我添加服务类时,VS 自动将配置添加到 app.config。演示也试图添加这些信息。因为它已经在配置中,我删除了演示部分,它工作了。

我在一个旧的2010 ExchangeServer 上遇到了同样的错误。 服务(Exchange 邮箱复制服务)发出上述错误,无法继续迁移过程。 通过互联网搜索,我得到了这个 链接,它说明了以下几点:

ExchangeGRE 在第一次安装时或在对 IIS 服务器进行任何更改时打开失败。它失败的管理单元错误,当您尝试打开管理单元页面,显示以下内容:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

原因 : 发生此错误是因为另一个应用程序已经在使用 http 端口号443,而且 IIS 服务器没有配置为处理到同一端口的多个绑定。

解决方案 : 配置 IIS 服务器以处理多端口绑定。请与供应商(Microsoft)联系进行配置。

由于这些服务是从 IISWeb 服务器提供的,因此检查根站点上的 Bindings 可以解决这个问题。有人搞乱了站点绑定,定义了重叠的规则,搞乱了服务。

在我的例子中,修复正确的 Bindings 解决了问题,而且我不必配置 Web.Config。