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

Jer*_*emy 181 .net wcf

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

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

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

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

eri*_*cvg 163

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

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 注意 - 这里有一个拼写错误 - 没有关闭>,所以如果你复制粘贴,你就会遇到麻烦 (2认同)
  • 它不适用于这个问题:"只有使用HTTP协议才能使用此功能." (2认同)

Jer*_*emy 145

摘要,

代码解决方案: 这里

配置解决方案: 这里

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>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,net.tcp://payroll.myorg.com:8000和 http://shipping.myorg.com:9000是唯一的基本地址,用于各自的方案,允许传递.baseAddressPrefixFilter不支持任何通配符.

IIS提供的baseAddresses可能具有绑定到baseAddressPrefixFilter列表中不存在的其他方案的地址.这些地址不会被过滤掉.

Dns解决方案(未经测试): 我认为如果您创建了一个特定于您的Web应用程序的新dns条目,添加了一个新网站,并为其提供了与dns条目匹配的单个主机标头,您将完全缓解此问题,并且不会必须编写自定义代码或在web.config文件中添加前缀.

  • 我开始认真思考WCF与ASP.net和通过JavaScript访问的Web服务的结合.普通的旧ASMX服务问题要少得多...... (42认同)
  • 将基地址前缀过滤器添加到web.config工作得很好.谢谢杰里米! (2认同)
  • 我想不出为什么会有人想要这样的限制,更不用说默认设置...... (2认同)

Mik*_*liy 58

你有没有看到这个 - 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> 
Run Code Online (Sandbox Code Playgroud)

使用ASP.NET 2.0/3.0/3.5,将以下行添加到web.config:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 
Run Code Online (Sandbox Code Playgroud)


小智 16

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

  • 遗憾的是,这是在底部.在我们的案例中,这为我们修复了它. (2认同)

boh*_*nko 8

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

更换:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
Run Code Online (Sandbox Code Playgroud)

附:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))
Run Code Online (Sandbox Code Playgroud)

错误消失了.

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