2016-07-30 30 views
4

Ich entwickle eine Anwendung, Server-Side-Technologie ist asp.net Web-API, Client-Seite ist Javascript. In meiner Anwendung verwende ich Signalr, um Clients über Updates zu benachrichtigen - Push-Benachrichtigungen vom Server an die Clients.Integrieren Signaler mit Web API, Push-Benachrichtigungen an Clients

Die gesamte Signalinteraktion findet außerhalb der Hub-Klasse statt, da die Pushs von HTTP-Anforderungen kommen und nicht von einem Client-Push zum Server über den Signalgeber.

Nach dem Verarbeiten einer erfolgreichen HTTP-Anfrage möchte ich alle Clients neben demjenigen, der die Anfrage gesendet hat, benachrichtigt werden.

Wer sollte für diese Benachrichtigungen verantwortlich sein? Sollte mein Server nach der Verarbeitung einer rechtlichen Anforderung nur eine Benachrichtigung an die Clients senden? (Dies ist, was ich im Moment mache) Wenn dies der Weg ist, wie kann ich alle Kunden außer dem, der die Anfrage gestellt hat, benachrichtigen? Erinnerung - weil die Anfrage war Http und nicht Signal Push, die Push-to-Client-Seite passiert in einer Klasse außerhalb des Hub. Daher kann ich die Context- oder die Client.Other-Eigenschaft nicht verwenden, wie Sie es wahrscheinlich vorgeschlagen hätten. Wie könnte ich wissen, welche Kunden benachrichtigt werden sollen? Im Moment benutze ich nur Clients.All und derjenige, der die Anfrage gestellt hat, wird ebenfalls benachrichtigt, was ich nicht mag.

Option 2 ist das nach meinen Serverantworten mit einem Erfolgsstatuscode. Der Client, der die Anfrage gemacht hat, ist dafür verantwortlich, die anderen Clients zu benachrichtigen - was bedeutet, dass er die Nachricht an den Server sendet und der Server diese Benachrichtigung an alle anderen Clients weiterleitet (dieses Mal wird es innerhalb des Signal Hub sein, damit ich es nutzen kann) Kunden.Andere).

Welchen Ansatz sollte ich wählen?

Antwort

3

Ich denke, Ihre erste Annäherung ist nahtlos und wäre ziemlich einfach zu implementieren. Außerdem möchten Sie nicht, dass Benutzer für Benachrichtigungen zuständig sind. Benutzer sind faul.

Also im Grunde, nachdem Sie Ihre Anfrage "verarbeitet" haben und Sie keine Ausnahmen gefangen haben, erhalten Sie Ihren SignalR Hub Context und verwenden Sie die integrierte SignalR C# API, um eine Nachricht an alle Clients zu senden der Absender.

Hier einige Code, der in Ihre Controller gehen würde:

[Route("ProcessMessage")] 
    public async void ProcessMessage(string[] clientConnectionStrings) 
    { 
     // do some processing 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>(); 

     hub.Clients.AllExcept(clientConnectionStrings); 
    } 

Sie müssen passieren im Client-Verbindung ID AllExcept zu verwenden, aber es sollte eine ziemlich einfache Integration sein. (Hinweis: dass, wenn Sie wurden direkt mit Ihrem SignalR Hub interagieren würden Sie nicht, dies zu tun haben)

Hinweis: Um die Kundenverbindung erhalten von Ihrer Sendung ausschließen möchten, können Sie es mögen Zugang:

$.connection.hub.id

Ein anderer Ansatz könnte die direkte Verwendung des SignalR Hub sein, würde jedoch zusätzlichen JavaScript-Code erfordern, um Ereignisse auf dem Hub-Server auszulösen. Zum Beispiel:

$.ajax({ 
     url: 'Some/Url/', 
     type: 'POST', 
     success: function (data) { 
       connection.server.someDataChangeEvent(); 
     }, 
     error: function (ex) { return; } 
    }); 

SignalR Hub-Code:

public void SomeDataChangeEvent(string connId) 
{ 
    Clients.Others.updateData(_someDataStore.getUpdates().ToList()); 
} 

Client-Code:

connection.client.updateData = function() { 
    //do stuff 
} 
+0

Durch diese Option wählen, werde ich auf alle meine Wünsche ändern einen anderen Parameter zu nehmen - die Kunden ID?Gibt es einen besseren Weg? Ich möchte nicht die gesamte funktionierende und getestete API ändern –

+0

Siehe mein Update, wenn Sie möchten. –

+0

Ich denke, Ihr Code beschreibt meine zweite Option - haben die Client-Seite einen Push nach einer erfolgreichen Anfrage auslösen, habe ich recht? –