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


182

我构建了一个Web应用程序,其中包含WCF服务协定和Silverlight控件,该控件对该WCF服务进行调用。在我的开发和测试服务器上,它运行良好。

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

该集合已包含一个使用方案http的地址。该集合中每个方案最多可以有一个地址。

我读到,如果网站具有多个主机头,则可能引发此异常,这在我们的实时服务器上是正确的。显然,IIS中托管的WCF服务只能具有一个基本地址。我该如何解决这个问题?

Answers:


166

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

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

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

http://msdn.microsoft.com/zh-CN/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx


是的,但这仅适用于.NET 4.0及更高版本。无法在.NET 2.0 / 3.0 / 3.5站点上使用此功能。
Bytemaster

2
注意-这里有错别字-没有结束>,所以如果您复制粘贴,就会遇到麻烦
sydneyos 2010年

2
该问题不适用于此问题:“此功能仅在使用HTTP协议时可用。”
乔治·齐奥科斯

146

摘要,

代码解决方案: 这里

配置解决方案: 此处

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
将基地址前缀过滤器添加到web.config可以很好地工作。谢谢杰里米!
2009年

2
我想不出任何理由为什么要这样的限制,更不用说默认设置了……
pbz

42
我开始对WCF与ASP.net和可通过JavaScript访问的Web服务结合在一起进行认真思考。我对普通的旧式ASMX服务的问题要少得多……
Juri)

好吧,如果您的网站同时运行着.net 4和.net 2应用程序。该应用程序的基础是.net4,并且它下面有几个需要.net2的应用程序。您是否在所有.net4文件中使用<serviceHostingEnvironment multipleSiteBindingsEnabled =“ true”>,并在.net 2应用程序中使用前缀?
特拉维斯

59

您看到了吗-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> 

谢谢。我将继续搜索以查看是否存在非代码解决方案。可以在配置中完成的事情,因为这将影响我们所做的任何项目,我希望不必编写自定义代码。
杰里米

16

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


1
是的,Amar这非常有帮助-就我而言,这是一个具有多个绑定的ANOTHER网站,使它中断。在同一台计算机上外部可用(但具有不同的主机名)。同样,可以通过添加multipleSiteBindingsEnabled设置来修复它,但是web.config将不同于所有其他环境。
编码员

2
可惜这是在底部。就我们而言,这为我们解决了它。
brendonparker 2014年

它帮助我在开发环境中复制错误。我既不能在认证环境中也不能在网站环境中编辑网站绑定。我已经更改了主机文件以模拟域,并向本地IIS和bam添加了绑定!
MFedatto

8

就我而言,这很简单:我在Visual Studio中使用了“添加WCF服务”向导,该向导会在app.config中自动创建相应的部分。然后,我继续阅读如何:在托管应用程序中托管WCF服务。问题是:我不需要指定URL即可运行Web服务。

更换:

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

带有:

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

错误消失了。

通用思路:如果将基地址作为参数提供在config中指定,则会出现此错误。您很可能不是唯一的获得错误的方法。


解决了我的问题。
QShengyao's

2

我遇到了这个问题,原因很傻。我正在尝试有关通过命令行可执行文件运行ServiceHost的Microsoft演示。我遵循了说明,包括说明添加适当的服务(和接口)的位置。但是我得到了上面的错误。

原来,当我添加服务类时,VS会自动将配置添加到app.config中。演示也在尝试添加该信息。由于它已经在配置中,因此我删除了演示部分,并且它起作用了。


0

我在旧的2010 Exchange Server上遇到了相同的错误。某个服务(Exchange邮箱复制服务)发出上述错误,并且迁移过程无法继续。在互联网上搜索时,我看到了以下链接

首次安装或对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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.