2009-02-18 122 views
167

我构建了一个Web应用程序,其中包含一个WCF服务合同和一个调用该WCF服务的Silverlight控件。在我的开发和测试服务器上,它的效果很好。WCF服务启动错误“此集合已包含地址与方案http”

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

此集合已经包含一个地址与方案http。此集合中每个方案最多可以有一个地址。

我读到,如果网站有多个主机头,这个异常可能会被抛出,这在我们的实时服务器上是正确的。显然,IIS中托管的WCF服务只能有一个基址。我怎样才能解决这个问题?

回答

141

摘要,

代码解决方案: 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

将基地址前缀过滤器添加到web.config完美工作。谢谢杰里米! – Mike737 2009-07-07 07:32:17

+2

我想不出有什么理由为什么会想要这样的限制,更不用说默认设置... – pbz 2009-11-19 00:49:08

+42

我开始对WCF与ASP.net以及通过JavaScript访问的Web服务结合起来思考得很差。我对ASMX普通服务的问题要少得多...... – Juri 2010-05-10 09:34:18

48

你看到这一点 - 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> 
+0

谢谢。我将继续搜索以查看是否存在非代码解决方案。有些东西可以在配置中完成,因为这将影响我们所做的任何项目,我希望不必编写自定义代码。 – Jeremy 2009-02-18 16:59:59

+0

这是线程中的最佳答案。 – MFedatto 2016-05-04 21:47:59

14

在这个问题上我的情况下,根本原因是在父网站即InetMgr->站点 - >站点Mysite->属性 - > EditBindings定义了多个HTTP绑定。我删除了一个不需要的http绑定,问题得到解决。

5

对我来说很简单:我在Visual Studio中使用'添加WCF服务'向导,该向导会自动在app.config中创建相应的部分。然后我继续阅读How to: Host a WCF Service in a Managed Application。问题是:我不需要指定url来运行Web服务。

替换:

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

有了:

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

和错误消失了。

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

1

我有这个问题,原因很愚蠢。我正在尝试微软的演示,关于从命令行可执行文件中运行ServiceHost。我遵循了这些说明,包括它说要添加适当的服务(和界面)的地方。但是我得到了上述错误。

当我添加服务类时,VS自动将配置添加到app.config。演示试图添加该信息。由于它已经在配置中,我删除了演示部分,它工作。