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

2つのオプション:

  1. 簡単な方法:mexポイントのバインディング全体をnetTcpBindingに変更し、bindingConfigurationを再利用します。mexTCPBindingは便利なことだけを目的としており、オプションです。うまくいかない場合は、使用しないでください。

  2. 難しい方法:mexTCPBindingを変更して共有を有効にすることができます。私が見た唯一の例はここのコードにあります:リンク

于 2010-11-15T05:26:17.083 に答える