我构建了一个包含WCF服务契约和Silverlight控件的Web应用程序,该控件调用该WCF服务。在我的开发和测试服务器上它运行良好。
当我部署到我们的实时服务器并运行应用程序时,我得到类型System.ServiceModel.ServiceActivationException
的异常,该异常表明由于编译期间的异常而无法激活该服务。例外是:
此集合已包含方案http的地址。此集合中每个方案最多只能有一个地址。
我读到如果网站有多个主机头,则可能抛出此异常,这在我们的实时服务器上是正确的。显然,IIS中托管的WCF服务只能有一个基地址。我怎样才能解决这个问题?
答案 0 :(得分:160)
在.Net 4中,您可以使用multipleSiteBindingsEnabled
选项:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
</system.serviceModel>
然后,您不必指定每个地址。
答案 1 :(得分:145)
概要,
代码解决方案: Here
配置解决方案: Here
在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中 名单。这些地址不会 过滤掉了。
Dns解决方案(未经测试): 我认为,如果您创建了一个特定于您的Web应用程序的新dns条目,添加了一个新的网站,并为其提供了与dns条目匹配的单个主机标头,您将完全缓解此问题,并且不必编写自定义代码或在web.config文件中添加前缀。
答案 2 :(得分:55)
你看到了吗 - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx
您可以通过更改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>
答案 3 :(得分:15)
在我的情况下,这个问题的根本原因是在父网站上定义了多个http绑定,即InetMgr-&gt; Sites-&gt; Mysite-&gt; properties-&gt; EditBindings。我删除了一个不需要的http绑定,问题得到了解决。
答案 4 :(得分:6)
就我而言,这很简单:我在Visual Studio中使用了“添加WCF服务”向导,该向导会自动在app.config中创建相应的部分。然后我继续阅读How to: Host a WCF Service in a Managed Application。问题是:我不需要指定运行Web服务的URL。
替换:
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
使用:
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))
错误消失了。
通用想法:如果您提供基址作为参数并且在配置中指定它,则会出现此错误。很可能,这不是获得错误的唯一方法,你。
答案 5 :(得分:2)
我有这个问题,原因很愚蠢。我正在尝试微软关于在命令行可执行文件中运行ServiceHost的演示。我按照说明进行操作,包括添加相应服务(和界面)的说明。但我得到了上述错误。
当我添加服务类时,VS自动将配置添加到app.config。该演示也试图添加该信息。由于它已经在配置中,我删除了演示部分,并且它有效。
答案 6 :(得分:0)
我在一个旧的2010 Exchange Server上遇到了相同的错误。 某个服务(Exchange邮箱复制服务)发出上述错误,并且迁移过程无法继续。 通过互联网搜索时,我看到了这个link,其中指出:
首次安装或对IIS服务器进行任何更改时,Exchange GRE无法打开。它因管理单元错误而失败,并且当您尝试打开管理单元页面时,将显示以下内容:
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)联系以对其进行配置。
由于这些服务是从IIS Web服务器提供的,因此检查根站点上的绑定可解决此问题。有人弄乱了站点绑定,定义了规则,这些规则相互重叠并弄乱了服务。
修复正确的绑定对于我来说可以解决此问题,而且我不必配置Web.Config。