首页 文章

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

提问于
浏览
172

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

当我部署到我们的实时服务器并运行应用程序时,我得到类型 System.ServiceModel.ServiceActivationException 的异常,该异常表明由于编译期间的异常而无法激活该服务 . 例外是:

此集合已包含带有方案http的地址 . 此集合中每个方案最多只能有一个地址 .

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

6 回答

  • 1

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

  • 145

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

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

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

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

  • 51

    摘要,

    Code solution: Here

    Configuration solutions: 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 solution (untested): 我认为如果您创建了一个特定于您的Web应用程序的新dns条目,添加了一个新网站,并为其提供了与dns条目匹配的单个主机标头,您将完全缓解此问题,并且不必编写自定义代码或者在web.config文件中添加前缀 .

  • 14

    你看到了吗 - 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>
    
  • 5

    在我的例子中它很简单:我在Visual Studio中使用了'Add WCF Service'向导,它在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))
    

    错误消失了 .

    一般的想法:如果您提供基址作为参数并在配置中指定它,则会出现此错误 . 很可能,这不是获得错误的唯一方法,你 .

  • 157

    我有这个问题,原因很愚蠢 . 我正在尝试微软关于在命令行可执行文件中运行ServiceHost的演示 . 我按照说明进行操作,包括添加相应服务(和界面)的说明 . 但我得到了上述错误 .

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

相关问题