在IIS 7(WAS)中使用net.tcp绑定托管WCF服务,使用两个TCP端口。

5

默认情况下,IIS 7网站具有带有“808:”绑定信息字符串的net.tcp绑定。 如果我添加另一个带有“xxx:”的net.tcp绑定,则会出现异常:

此集合已经包含了一个方案为net.tcp的地址。 此集合中每个方案最多只能有一个地址。 参数名称:item

我该如何解决这个问题并在两个端口上监听我的服务?

3个回答

8

基本上,在您的服务中,您应该能够定义任意数量的服务端点在任意数量的端口上。

有两种方法可以做到这一点:

  • 在您的服务端点中定义基本地址和相对地址
  • 在每个端点中定义完整地址

如果选择选项#1,则会得到以下内容:

<service name="YourService">
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://YourServer:5151/Services" />
    </baseAddresses>
  </host>
  <endpoint name="endpoint1"
            address="Service1"
            binding="netTcpBinding"
            contract="IYourService" />
  <endpoint name="endpoint2"
            address="Service2"
            binding="netTcpBinding"
            contract="IYourService" />
</service>

在这种情况下,您有相同合同的两个服务端点,并且它们将侦听URL。
net.tcp://YourServer:5151/Services/Service1

并且

net.tcp://YourServer:5151/Services/Service2

您可以拥有多个服务终结点,但只能有一个基础地址。

另一种选择是不指定基础地址,并直接在终结点中指定完整的服务地址:

<service name="YourService">
  <endpoint name="endpoint1"
            address="net.tcp://YourServer:5151/Services/Service1"
            binding="netTcpBinding"
            contract="IYourService" />
  <endpoint name="endpoint2"
            address="net.tcp://YourServer:6868/Services/Service2"
            binding="netTcpBinding"
            contract="IYourService" />
</service>

在这种情况下,由于你在端点中定义了整个地址,因此可以选择两个不同的TCP端口,每个端点一个。这应该完全没有问题。你有两个独立的端点在两个不同的端口上监听,并由后台的同一服务类提供服务。

1
我在某个地方读到,baseAddresses 在 IIS 环境中被忽略了。 - Konstantin
我会同意您的评论并提供一个链接来证明。在IIS方面,基地址基本上被忽略了,但是由于提供了终结点地址,上述示例仍然适用。它们与IIS中的站点绑定信息隐式使用。http://msdn.microsoft.com/en-us/magazine/cc163412.aspx - dyslexicanaboko

2
我曾试图将一个WCF服务部署到我的一个Web服务器上,但遇到了问题。我一直收到以下错误消息:此集合已经包含了一个具有http方案的地址。在此集合中,每个方案最多只能有一个地址。参数名称:item。
这个问题在我的本地机器上没有发生,但在Web服务器上却出现了问题,这使得找出问题原因有点困难。这是因为我的Web服务器处于共享托管环境中,所以WCF服务还需要知道主机标头。为了解决这个问题,我在web.config中导航到并添加了以下内容:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>    
    <add prefix=http://MyHostHeader />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>

1
在.NET 4.0中,可以通过<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>来解决这个问题。 - Justin Dearing

0

我又来了。

这适用于自托管。

 <baseAddresses>
            <add baseAddress="net.tcp://localhost" />
            <add baseAddress="net.tcp://localhost:12345" />
 </baseAddresses>

但是在IIS7+WAS中会导致异常

无法连接到net.tcp://localhost:12345/game2.svc。 连接尝试持续了00:00:02.0936160的时间跨度。 TCP错误代码10061:由于目标计算机积极拒绝,因此无法建立连接127.0.0.1:12345。

这个问题与IIS托管环境有关


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接