2014-01-21 7 views
8

Ich arbeite an diesem Projekt, wo es eine Website gibt, die feedded Daten in "Echtzeit" durch einen WCF-Duplex-Dienst auf einem Remote-Server erhält. Die Updates haben eine Frequenz von etwa einer Sekunde, und ich benutze SignalR Client-Seite, um die Ansicht zu aktualisieren. (Jedes Mal, wenn ein "Paket" aus dem Service eingeht, informiere ich meine Kunden).Sollte ich SignalR über WCF Duplex-Dienste in Betracht ziehen?

Momentan habe ich Probleme mit dieser Lösung, weil der Duplex-Dienst funktioniert. Wann immer es keine "Echtzeit" -Verbindung zum Backend-Server gibt, der sie mit Daten versorgt, sollte der Dienst einfach den neuesten Datenbankeintrag an meinen Client senden. Das funktioniert, aber meine Kundenansicht scheint das nicht richtig zu erfassen. Wenn ich versuche, die Ansicht zu aktualisieren, ist es tatsächlich zufällig, welche Werte von Zeit zu Zeit aktualisiert werden. (Beim Debuggen sind die Werte alle dort in der notify-Methoden)

Ich habe versucht, mit Jquery/Ajax eine Methode in meinem Controller rufen Sie die Verbindungen wie diese Einrichtung:

setTimeout(function() { 

     $.ajax({ 
      type: 'GET', 
      url: '@Url.Action("ConnectToDataSources", "Fleet")', 
      cache: false, 
      success: function (result) { 

      } 
     }); 
}, 1000) 

Und in mein Controller:

public void ConnectToDataSources() 
{ 
    UnitContract[] listOfUnitsFromService = UnitClient.GetUnits(false, "", false); 

    Model = new FleetModel 
    { 
     UnitDetails = GenerateUnitDetails(listOfUnitsFromService.ToList()), 
    }; 

    foreach (UnitDetailsModel unit in Model.UnitDetails) 
    { 
     var ods = new OperationDataSource(); 
     var ads = new ActivityStatusDataSource(); 

     ads.Start(unit.UnitId, ActivityReceived, AliveReceived); 
     ods.Start(DataReceived, unit.UnitId); 
     _dataSources.Add(ods); 
     _activityStatusDataSources.Add(ads); 
    } 
} 

nach viel Versuch und Irrtum hielt ich habe den Back-End-Dienst zu ändern SignalR als auch zu verwenden. Habe ich es richtig verstanden, dass SignalR die oben beschriebene Funktionalität sowohl auf Server als auch auf Client ersetzen kann?

Auch, wenn jemand die gleiche Art von Einrichtung hat bin ich sehr daran interessiert zu hören, wie Sie dieses Problem gelöst :)

Antwort

6

Ja. SignalR verwendet WebSockets wo es kann und hat Fallbacks, wo es nicht möglich ist. WebSockets sind viel besser als ein Duplex-Service, weil:

  1. Es eine einzige TCP Verbindung verwendet, um Daten in beiden Richtungen zu senden.
  2. Der Server muss die IP des Clients nicht kennen (es funktioniert in einem Duplex-Dienst, der in einem Fall von geteilten IP nicht funktioniert).

Also .. ja. SignalR ist eine gute Passform.

+0

Sie können nicht sagen "WebSockets sind viel besser als ein Duplex-Dienst", weil man Protokoll ist und ein anderes ist ein Framework, das Ihnen erlaubt, jedes Protokoll zu verwenden, das Dual-Transport unterstützt (oder sogar nicht unterstützt, wie im Fall von wsDualHttpBinding) einschließlich WebSockets. Zu der Zeit, als diese Antwort veröffentlicht wurde, gab es NetHttpBinding um, die native unterstützt Duplex WCF über WebSockets –

+0

@VitaliyUlantikov Diese Antwort ist 18 Monate alt, ich habe keine Erinnerung daran. Sie können es nach Belieben bearbeiten, wenn Sie mehr darüber wissen. – i3arnon

Verwandte Themen