Sie sind hier: Weblog

WCF und Port-Sharing bei netTcpBinding

Foto ,
28.05.2011 15:15:00

Bei der Entwicklung von Produkten erscheint es wünschenswert, die Anzahl der benötigten TCP-Ports niedrig zu halten, zumal diese auf eventuellen inner- oder zwischenbetrieblichen Firewalls freigeschaltet werden müssen. Aus diesem Grund bietet WCF die Möglichkeit, verschiedene Services über denselben TCP-Port zur Verfügung zu stellen. Voraussetzung dafür ist, dass sich die einzelnen Service-URLs unterscheiden, dass Port-Sharing für das netTcpBinding aktiviert wird und dass der Windows-Service Net.Tcp Port Sharing Service gestartet ist.
Das nachfolgende Listing zeigt eine Konfiguration, die den Einsatz von Port-Sharing vorsieht. Dazu wurde in der Standard-Binding-Konfiguration für netTcpBinding die Eigenschaft portSharingEnabled auf true gesetzt und als Basisadresse net.tcp://localhost:9000/FlugBuchungsService definiert. Ein anderer Service-Host könnte nun ebenfalls Port 9000 verwenden, sofern er sich auf eine andere Service-Url abstützt (zum Beispiel net.tcp://localhost:9000/HotelService und ebenfalls Port-Sharing aktiviert.

Bei Betrachtung dieser Konfiguration fällt auf, dass für die Konfiguration von Metadata-Exchange ebenfalls das netTcpBinding und nicht das dafür vorgesehene mexTcpBinding herangezogen wurde. Das ist notwendig, um Probleme im Zusammenhang mit letzterem Binding beim Einsatz von Port-Sharing zu vermeiden.
<system.serviceModel>

    <bindings>
      <netTcpBinding>
        <binding portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <services>
    
      <service name="FlugService.FlugBuchungsService">

        <endpoint
          address=""
          binding="netTcpBinding"
          contract="FlugService.IFlugBuchungsService" />

        <endpoint
          address="mex"
          binding="netTcpBinding"
          contract="IMetadataExchange" />

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

      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>


  </system.serviceModel>