11

我有一个作为 Windows 服务托管的 WCF 服务。我们希望在同一地址启用一个 mex 端点(但带有“/mex”后缀)。我一直在尝试使用以下配置执行此操作(未成功):

<system.serviceModel>

  <services>
    <service
      name="MyCompany.MyService"
      behaviorConfiguration="defaultServiceBehavior">

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

      <endpoint
        address="MyService"
        binding="netTcpBinding"
        contract="MyCompany.IMyService"
        bindingConfiguration="netTcpBindingConfig"
        />

      <endpoint
        address="MyService/mex"
        binding="mexTcpBinding"
        contract="IMetadataExchange"
        />

    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="defaultServiceBehavior">
        <serviceMetadata />
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <bindings>
    <netTcpBinding>
      <binding name="netTcpBindingConfig" portSharingEnabled="true" />
    </netTcpBinding>
  </bindings>

</system.serviceModel>

当它运行时,服务主机会抛出一个AddressAlreadyInUseException抱怨“IP 端点 0.0.0.0:808 上已经有一个侦听器”。这对我来说实际上是有意义的,因为端口共享服务已经打开了该端口,以便为MyService端点以及任何其他请求在这台机器上共享该端口的服务提供服务。

所以看起来 mex 端点想要独占访问端口 808。我可以通过像这样调整 mex 端点来解决这个问题:

<endpoint
  address="net.tcp://localhost:818/MyService/mex"
  binding="mexTcpBinding"
  contract="IMetadataExchange"
  />

这意味着 mex 端点现在拥有自己的专有端口。这样做的缺点是任何其他想要公开 mex 端点的服务也需要一个唯一的端口用于它的 mex 端点。这使得在寻找 mex 端点时变得非常不可预测。

有没有办法强制 mex 端点参与端口共享?

4

1 回答 1

9

两种选择:

  1. 简单的方法:将 mex 点的整个绑定更改为 netTcpBinding 并让它重用您的 bindingConfiguration。mexTCPBinding 只是为了方便,是可选的。如果它不适合您,请不要使用它。

  2. 困难的方法:您可以修改 mexTCPBinding 以启用共享。我见过的唯一例子是这里的代码:链接

于 2010-11-15T05:26:17.083 回答