2014-06-12 18 views
8

Ich habe eine Web-Anwendung, die wenige Diagramme auf dem Armaturenbrett hat. Die Daten für Diagramme werden in der document.ready-Funktion auf Clientseite abgerufen, die eine WCF-Dienstmethode aufruft.WCF-Service mit SignalR

Was ich will, ist jetzt SignalR in meiner Anwendung zu verwenden. Ich bin wirklich neu in SignalR. Wie kann ich WCF-Methoden von SignalR Hub aufrufen oder was Sie sagen können ist, dass anstatt Daten vom Server zu ziehen ich möchte, dass der WCF-Dienst Daten jede Minute zum Client überträgt.

Gibt es eine Möglichkeit der Kommunikation zwischen signalR und WCF-Dienst?

Ein weiterer Ansatz kann sein, den Client zu zwingen, jede Minute Daten vom WCF-Dienst anzufordern.

Jede Hilfe wird wirklich geschätzt.

Ich habe folgendes bisher gemacht.

Client Side-Funktion auf meiner Dashboard-Seite

<script src="Scripts/jquery.signalR-2.0.3.min.js"></script> 
    <!--Reference the autogenerated SignalR hub script. --> 
    <script src="/signalr/hubs"></script> 
<a id="refresh">Refresh</a> 
    $(function() { 
      var dashboardHubProxy = $.connection.dashboardHub; 
      $.connection.hub.start().done(function() { 
       // dashboardHubProxy.server.refreshClient(parameters); 
       $("#refresh").click(function() { 
        dashboardHubProxy.server.refreshClient(parameters); 
       }); 
      }); 
      dashboardHubProxy.client.refreshChart = function (chartData) { 
       debugger; 
       DrawChart(chartData, 'Hourly Call Count For Last ' + Duration + ' Days', '#chartHourly', 'StackedAreaChart'); 
      }; 
     }); 

und Klasse meiner Dashboard-Hubs ist als

public class DashboardHub : Hub 
{ 
    private readonly ReportService ReportService = new ReportService(); 


    public void RefreshClient(string parameters) 
    { 
     var chartData = ReportService.GenerateHourlyCallsTrendGraphicalReport(parameters); 
     Clients.All.refreshChart(chartData); 
    } 
} 

Meine SignalR Startklasse folgt, ist als

[assembly: OwinStartup(typeof(CallsPortalWeb.Startup), "Configuration")] 
namespace CallsPortalWeb 
{ 
    public static class Startup 
    { 
     public static void Configuration(IAppBuilder app) 
     { 
      ConfigureSignalR(app); 
     } 
     public static void ConfigureSignalR(IAppBuilder app) 
     { 
      app.MapSignalR(); 
     } 
    } 
} 

folgt Wenn ich auf Bei der Refresh-Schaltfläche und einem Debugger auf der RefreshClient-Methode auf Hub gelangt der Debugger nicht zum Met hod, was bedeutet, ich bin nicht in der Lage, serverseitige Methode von SignalR aufzurufen.

Ist in web.config etwas zu tun?

+0

die einzige Sache, die ich wirklich will, ist in der Lage, den Server Push-Daten zum Dashboard machen –

+0

Leider werden wir nicht für Sie Code, Sie können Code zur Verfügung stellen und wir können helfen, es zu klären und Ihren Versuch zu verfeinern. Die Links, die ich unten zur Verfügung stelle, erklären SignalR, es ist nicht etwas, das magisch passiert, dass du es lesen und lernen musst, für das ich die Ressourcen bereitgestellt habe, um genau das zu tun. Wenn Sie keinen Code bereitstellen, den Sie versucht haben, können Sie die gesuchte Antwort nicht finden, da wir Ihnen nichts ausrichten können. – Tony

+1

Um meinen Kommentar weiter zu vertiefen, sind Sie sich bewusst, dass SignalR nicht die Verbindungen selbst beharrt? Wie planen Sie, zu speichern, wer verbunden ist und wer von welcher Gruppe getrennt ist und wer diese Updates erhalten soll, die Sie an das Dashboard senden möchten, wenn Sie eine statische Sammlung verwenden oder in der Datenbank persistieren, werden Sie diese verwenden mehrere Server? Ist dieser Dashboard-Benutzer spezifisch oder senden Sie die Daten an die ganze Welt? Es gibt viel mehr hinter signalR, als nur eine Nachricht zu senden und die UI vom Server zu aktualisieren. – Tony

Antwort

11

habe, werde ich mit AD.Net ist einverstanden Kommentar. Etwas ausführlicher können die SignalR-Hubs jedoch direkt in Ihrem Web-Projekt gehostet werden, ähnlich wie Controller verwendet werden. Es gibt auch ein Paket, mit dem Sie die SignalR-Bibliothek eigenständig hosten können. In jedem Fall müssen Sie zuerst den SignalR-Hub treffen, da dies die Art der Kommunikation ist. Dann würden Sie Ihre WCF-Service-Methoden innerhalb der Hubs aufrufen.

Kurze Erklärung

Ihre HUB werden Methoden von Ihrem USER beide Clients verwendet haben und Ihre WCF-Client. Sie können etwas wie UserConnected() für den Benutzer verwenden, um sich anzumelden und Ihre Protokollierung der Verbindung einzurichten.Dann kann der WCF-Dienst Ihren HUB mit einer UpdateUserStats(Guid connnectionId, UserStats stats) anrufen, die wiederum den USER-Client direkt aufrufen würde und die so übermittelten Werte wie Clients.Client(connectionId).updateStats(stats) bereitstellen würde, die wiederum eine Methode auf dem USERS-Client namens updateStats() hätten, die die empfangenen Informationen verarbeiten würde.

Erste Seite Landung

Was bereitgestellt AD.Net ist einfach Code, der aufgerufen wird, wenn der Benutzer landet auf der Seite. An dieser Stelle möchten Sie die ConnectionId für diesen Benutzer protokollieren, damit Sie sie direkt kontaktieren können.

Erster Kontakt mit Ihrem Hub WCF berühren

Von Ihrem Hub, könnten Sie Ihre WCF-Dienst aufrufen, wie Sie normalerweise in jedem normalen C# -Code würde Ihre Daten abzurufen oder Aktion ausführen und senden Sie es an Ihre Benutzer.

Verfahren zur Bestimmung der Benutzer regelmäßig zu aktualisieren

SignalR beseitigt die Notwendigkeit für den Client-Code ständig zu müssen, um den Server für Updates abzufragen. Es ermöglicht Ihnen, Daten an den Client zu senden, ohne dass sie direkt danach gefragt werden. Hier kommt die Beständigkeit der Verbindungen ins Spiel.

Sie möchten wahrscheinlich einen Wrapper erstellen, um Nachrichten aus Ihrer Anwendung einfach an den Hub zu senden, da Sie WCF verwenden. Ich nehme an, dass Sie hinter dieser Ebene Ihre Geschäftslogik haben. Daher möchten Sie den WCF-Dienst erreichen Hub, wenn Aktion X passiert. Sie können dies tun, indem Sie den clientseitigen C# -Code verwenden, da in diesem Fall Ihr Client tatsächlich der Benutzer und der WCF-Dienst ist. Mit einer Chat-Anwendung macht der andere Benutzer grundsätzlich das, was Ihr WCF-Dienst tun soll, und sendet eine Nachricht an den anderen Client.

Anwendungsbeispiel

Sie einen Online-Shop läuft. Das Dashboard zeigt an, wie viele Bestellungen es für den Tag gab. Sie würden also einen Anruf an den Hub senden, um eine Nachricht zu senden, um die bestellten Produkte zu aktualisieren, wenn ein Benutzer eine neue Bestellung tätigt. Sie können dies tun, indem Sie es an die Admin-Gruppe senden, die Sie konfiguriert haben, und alle Admins auf dem Dashboard würden die Nachricht erhalten. Wenn diese Statistiken jedoch sehr benutzerspezifisch sind, greifen Sie wahrscheinlich eher in die Datenbank ein, suchen die ConnectionId, mit der der Benutzer verbunden ist, und senden die Aktualisierungsnachricht direkt an diese Verbindungs-ID.

WCF-Client-Code Beispiel

Nur incase Sie einen Code, dann ist dies direkt aus MS-Website mit einem .net-Client auf Verbinden. Sie würden dies in Ihrem WCF-Dienst oder an einem anderen Ort in Ihrem Code verwenden, an dem Sie eine Verbindung herstellen und dann ein Update an Ihren Benutzer senden möchten.

var hubConnection = new HubConnection("http://www.contoso.com/"); 
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub"); 
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price)); 
await hubConnection.Start(); 

Hier ist ein Link direkt auf den Abschnitt .Net-Client: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client

Ich bin sicher, dass Sie diesen Link gesehen haben, aber es hat wirklich alle guten Informationen, die Sie beginnen müssen. http://www.asp.net/signalr

Hier ist ein direkterer Link, der mit Code für Sie in Verwendung geht.http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server

HINZUGEFÜGT: Hier ist ein Blog speziell für Dashboards mit SignalR und deren Polling. http://solomon-t.blogspot.com/2012/12/signalr-and-interval-polling-for.html

HINZUGEFÜGT: Hier ist eine Seite über die Verwaltung der Benutzer signalR Verbindungen. http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections

Update für Ihren Code Update

Die .NET-Client-Bibliothek (in NuGet) gibt Ihrem .net Code Zugriff auf die Nabe. Da Sie ein Client sind, müssen Sie sich wie der Benutzer, der auch ein Client ist, mit dem Hub verbinden. Ihr Hub würde als Server dafür dienen. Mit dem .Net-Client nehme ich an, dass Sie einen Windows-Dienst einrichten würden, der intern abfragt, oder etwas Ereignisbasiertes, das den .Net-Client-Code-Teil davon aufruft, der auf Ihren Hub zugehen würde. Ihr Hub würde die bereitgestellten Informationen übernehmen, höchstwahrscheinlich eine ConnectionId oder GroupId, und den Benutzer (der sich vielleicht auf einer Website befindet, so dass es der JS-Client wäre) würde eine Broadcast-Methode verwenden, die das Frontend für den Benutzerclient aktualisiert. Grundsätzlich was ich unter "Kurze Erklärung" erwähne.

Jetzt, um direkt auf den Code zu antworten, den Sie gepostet haben. Das ist Javascript, ich würde eine Verbindung erwarten wie du es getan hast. Das Aktualisieren des Diagramms bei der ersten Verbindung ist auch in Ordnung. Wenn dies das gesamte Code-Signal ist, weisen Sie eine Client-seitige Methode zur Aktualisierung auf. Technisch gesehen, anstatt Client.Caller.RefreshChart() aufzurufen, könnten Sie einfach diese Daten zurückgeben und sie verwenden, was Ihr Javascript gerade macht. Du bist zurückgeblieben, aber es erwartet ein Date.

Jetzt würde ich eigentlich sagen, korrigieren Sie Ihr Javascript, anstatt den Hub-Code zu korrigieren. Warum? Da eine Methode in JS auf Ihrem Client, die "refreshChart()" genannt wird, wiederverwendet werden kann, wenn Sie Ihren Server erreichen und den Client aktualisieren.

Also ich würde empfehlen, alles, was mit der Aktualisierung des Dashboards in Ihrer JS-Done-Anweisung verbunden ist, fallen zu lassen. Wenn Sie eine Benachrichtigung oder etwas für den Benutzer tun möchten, ist das in Ordnung, aber aktualisieren Sie das Raster nicht.

Jetzt erstellen Sie eine JS-Client-Funktion namens "refreshChart", beachten Sie das Kleinbuchstabe R, können Sie es mit einem großen R in C# nennen, aber die Bibliothek js Bibliothek wird es Kleinbuchstaben, also wenn Sie die Funktion haben, wird es Ihr Dashboard erhalten Information.

Bei der Serverabfrage oder beim Ausführen einer Aktion ruft WCF jetzt eine Methode auf dem Hub auf, die "UpdateDashboar (connectionId, dashInfo)" heißt und diese Methode würde darin das "refreshChart" aufrufen "Genau wie Sie es in Ihrer RefreshClient-Methode tun, akzeptieren Sie, anstatt Client.Caller zu verwenden. Sie würden Clients.Client (connectionId) .refreshChart (chartInfo) verwenden.

Direkt der Grund, warum Ihr Code nicht funktioniert, ist, weil Sie diese Void in den Typ konvertieren müssen, den Sie erwarten, zurückgegeben werden. Wenn der Rest richtig codiert ist, wird es einmal aktualisiert. Sie müssen die andere Logik implementieren, die ich erwähnte, wenn Sie es ständig aktualisieren möchten. Deshalb habe ich gefragt, wie Sie Ihre Verbindungen beibehalten. Ich habe einen Link hinzugefügt, um Ihnen dabei zu helfen, wenn Sie nicht sicher sind, wovon ich spreche.

+0

Ich habe den Code zu meiner Frage hinzugefügt, um zu zeigen, was ich bisher getan habe –

+0

Ich habe meinen Code erneut bearbeitet und bin immer noch nicht in der Lage, die serverseitige Methode auf Hub aufzurufen. Kannst du mich untersuchen und führen? –

9

Sie sollten die SignalR Hub verwenden, um Daten an den Client zu senden. Ihre hub kann eine WCF service (die gleiche wie Ihre client kann) verbrauchen, um die Daten zu erhalten.

von client:

hub.VisitingDashBoard(); 

auf dem hub im VisitingDashBoard Methode:

var data = wcfClient.GetDashboardData()//may be pass the user id from the context 
     Clients.Caller.UpdateDashboard(data) 

Natürlich Ihre client einen Handler für UpdateDashboard Anruf

+0

ein Codebeispiel dafür? –