Sie sind hier: Weblog

WCF 4.5: Multicasts mit neuem udpBinding

Foto ,
15.10.2011 01:00:00

Für Fälle, in denen TCP zu viel Overhead mit sich bringt, bietet WCF 4.5 nun ein udpBinding an. Wie der Namen vemuten lässt, stützt es sich auf das verbindungslose Protokoll UDP und erlaubt somit eine, in Relation zu TCP gesehen, schlanke Form der Kommunikation - ohne Three-Way-Handshake und Bestätigungsnachrichten. Dies bedeutet aber auch, dass es der Sender nicht bemerkt, wenn Nachrichten verloren gehen. Insofern macht dieses Binding nur in Fällen sinn, wo das egal ist oder gar gewünscht ist, weil die Daten zum Beispiel nach einem erneuten Senden bereits veraltet wären.

Außerdem erlaubt UDP das Versenden von Multicasts. Damit sind Nachrichten gemeint, die von beliebig vielen Interessenten im lokalen Netzwerk empfangen werden können. Dazu verwendet man sowohl für den Service- also auch für den Client-Endpunkt eine IP-Adresse aus dem Bereich 224.x.x.x bis 239.x.x.x. Jene, die die Zeit der IPv4-Klassen miterlebt haben, werden diesen Adress-Bereich auch als Klasse D bezeichnen oder anders ausgedrückt: Alle Adressen dieses Bereichs beginnen haben ein binäres Muster, welches mit 1110 beginnt. Bei der Vergabe von Multicast-Adressen muss man sich jedoch vor Augen führen, dass die Adressen 224.x.x.x und 239.x.x.x für spezielle Zwecke reserviert sind, sodass sich dieser Wertebereich für die freie Verwendung auf 225.x.x.x bis 238.x.x.x beschränkt. Darüber hinaus soll an dieser Stelle nochmals ausdrücklich erwähnt werden, dass UDP-Nachrichten nicht über Netzwerkgrenzen geroutet werden und somit nur innerhalb eines Netzwerks herangezogen werden können.

Das nachfolgende Beispiel zeigt die Implementierung eines UDP-Multicasts. Es verwendet die Multicast-Adresse 225.1.1.1:9999. Somit können beliebig viele Instanzen des Service gestartet werden, wobei jeder Server alle vom Client gesendeten Nachrichten erhält, sofern diese nicht verloren gehen. Antworten mehrere Services auf eine Anfrage des Clients, zieht dieser lediglich die zuerst erhaltene heran; alle anderen werden ignoriert. Eine Möglichkeit, dies zu Umgehen, stellt der Einsatz von Callbacks (Duplex) dar. Allerdings unterstützt das udbBinding in der aktuellen Developer Preview (noch?) keine Duplex-Szenarien, weswegen diese manuell implementiert werden müssten.

Service-Konfiguration

<system.serviceModel>

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

 <endpoint address="FlugService" binding="udpBinding" contract="UdpSample.IFlugService"/>

 <host>
 <baseAddresses>
 <add baseAddress="soap.udp://225.1.1.1:9999/"/>
 </baseAddresses>
 </host>

 </service>
 </services>

 <behaviors>
 <serviceBehaviors>
 <behavior>
 <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
 <serviceDebug includeExceptionDetailInFaults="true"/>
 </behavior>
 </serviceBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>


Client-Konfiguration

<system.serviceModel>

 <client>
 <endpoint address="soap.udp://225.1.1.1:9999/FlugService"
 binding="udpBinding"
 contract="UdpSample.IFlugService"
 name="FlugService" />
 </client>

</system.serviceModel>