RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0,
Hanser Fachbuchverlag

Weitere Infos

 

.NET 4 Update,
Microsoft Press

Weitere Infos

 
Weitere Bücher
Meine Artikel

Leichtgewichtige Kommunikation: REST-basierte Services mit dem neuen API aus der ASP.NET-Familie,
windows.developer

Weitere Infos

 

EAI und EDI in der Cloud ,
windows.developer

Weitere Infos

 

Verteilt und doch ein Ganzes: Verteilte Systeme mit AppFabric Applications,
dot.net magazin

Weitere Infos

 

Vorschau auf Neuerungen der kommenden WCF-Version,
dot.net magazin

Weitere Infos

 

Windows Azure Tutorial, Teil 3: Verbindung zwischen Cloud- und lokalen Applikationen,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

MVC, die dritte: ASP.NET MVC 3 RC 2,
dot.net magazin

Weitere Infos

 

Leichtgewichtiges O/R-Mapping - Code Only mit Entitiy Framework CTP 5,
dot.net magazin

Weitere Infos

 

Weitere Artikel

Training & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Schulungen und Beratung Unternehmen bei der Planung und Umsetzung von großer Software-Systeme.

Mehr lesen

In Kontakt treten

 
Konferenzen

BASTA! on Tour von 4/25/2012 bis 4/27/2012 in Düsseldorf

Meine Talks

Web-Site der Konferenz

 

BASTA! Spring 2012 von 2/27/2012 bis 3/2/2012 in Darmstadt

Meine Talks

Web-Site der Konferenz

 

ADC - Advanced Developers Conference von 10/26/2011 bis 10/27/2011 in Frankental (Deutschland)

Meine Talks

Web-Site der Konferenz

 

Scandev on tour von 10/18/2011 bis 10/18/2011 in Stockholm (Schweden)

Meine Talks

Web-Site der Konferenz

 

BASTA 2011 von 9/26/2011 bis 9/30/2011 in Mainz

Meine Talks

Web-Site der Konferenz

 

Jazoon - International Conference on the modern art of software von 6/21/2011 bis 6/23/2011 in Zürich

Meine Talks

Web-Site der Konferenz

 

Scandinavian Developer Conference 2011 von 4/4/2011 bis 4/5/2011 in Göteborg (Schweden)

Meine Talks

Web-Site der Konferenz

 

SOA-Days von 3/30/2011 bis 3/31/2011 in Bonn

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 8. October 2011 15:02
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgrade" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings: netHttpBinding und netHttpsBinding. Allerdings müssen sie gemeinsam mit einem Web-Server eingesetzt werden, der den jungen WebSocket-Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features HTTP Activation, ASP.NET und WebSockets aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt oder von Anfang an erzwungen werden, indem das Attribut connectionMode in der Konfiguration auf Allowed bzw. Required gesetzt wird. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut subProtocol textuell anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde diese im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download:

WebSocketBinding.zip (61,45 kb)

 

[1] http://www.paulbatum.com/2011/09/getting-started-with-websockets-in.html

Kategorien: .Net 4.5 | WCF