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 "Upgread" 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 muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen  jungen 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" 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 werden. Dies wird mit dem Attribut  connectionMode in der Konfiguration gesteuert. Außerdem müssen beide  Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell   subProtocol 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 dies 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: Link