9

WCFでエンドポイントを公開する方法について少し混乱しています

tcpエンドポイントとmextcpエンドポイントがあります。

<service name="MessageReaderService.MessageReaderService">
    <endpoint name="NetTcpReaderService" 
        address="ReaderService" 
        binding="netTcpBinding" bindingConfiguration=""
        contract="Contracts.IMessageReaderService" />
    <endpoint name="netTcpMex" 
        address="mex" 
        binding="mexTcpBinding" bindingConfiguration=""
        contract="IMetadataExchange" />
    <host>
       <baseAddresses>
           <add baseAddress="net.tcp://localhost:8082" />
       </baseAddresses>
    </host>
 </service>

これをサービスホストで実行しようとすると、次の例外が発生します。

コントラクト名「IMetadataExchange」が、サービスMessageReaderServiceによって実装されたコントラクトのリストに見つかりませんでした。ServiceMetadataBehaviorを
構成ファイルまたはServiceHostに直接追加して、このコントラクトのサポートを有効にします。

したがって、このエラーから、メタデータを公開するためにサービス動作を追加する必要があると結論付けます。

だから私は動作を追加しました:

<behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>                  
</behavior> 

しかし、その後、別のエラーが発生します:

ServiceMetadataBehaviorのHttpGetEnabledプロパティはtrueに設定されており、HttpGetUrlプロパティは相対アドレスですが、httpベースアドレスはありません。httpベースアドレスを指定するか、HttpGetUrlを絶対アドレスに設定します。

  1. だから今、私は実際に別のエンドポイント(http)を追加して、mexhttpbindingを介してメタデータを公開する必要がありますか?
  2. tcpを介してエンドポイントを公開する簡単な方法はありますか?
4

1 に答える 1

17

2つのこと:

(1)サービスの動作を定義したら、もちろんそれをサービスにも適用する必要があります。

<service name="MessageReaderService.MessageReaderService"
         behaviorConfiguration="ServiceBehavior">

(2)HTTPエンドポイントは必要ありません-HTTP URLは必要ありません-このサービスの動作を次のように定義するだけです:

<behavior name="ServiceBehavior">
    <serviceMetadata />
</behavior> 

メタデータがエンドポイントで利用できるようになりました。HTTPを使用してメタデータをmexTcpBinding参照することはできませんが、クライアントは確実にメタデータに接続して使用できます。

これは、 WCFテストクライアントを使用して次のいずれかに移動することで確認できます。

net.tcp://localhost:8082        (the base address)

また

net.tcp://localhost:8082/mex    (the mex address)

どちらの場合も、WCFテストクライアントはサービスを検出し、その機能を検出できるようになります。

于 2012-04-13T17:06:32.393 に答える