Was ist der beste Weg, um eine asynchrone WCF-Anfrage abzubrechen?

8

(Angenommen, eine WCF-Methode namens "MyFunction")

Zur Unterstützung des Abbrechens einer WCF-Anfrage verwende ich derzeit die von svcutil generierten BeginMyFunction / EndMyFunction-Methoden (und behandeln ein IsCanceled-Flag, wenn die Ergebnisse an den Hauptthread gesendet werden). Ich möchte stattdessen die MyFunctionAsync-Methode (und stattdessen das MyFunctionAsyncCompleted-Ereignis) für asynchrone Aufrufe anstelle von Begin / End verwenden.

Was ist der beste / unterstützte Weg, um WCF-Anfragen abzubrechen, wenn MyFunctionAsyncCompleted verwendet wird und trotzdem sichergestellt ist, dass das Ereignis nicht auf einer Seite ausgelöst wird, die nicht mehr geladen ist (d. h. Seitennavigation innerhalb eines Frames).

Danke!

BEARBEITEN:

Ich habe entschieden, dass ich mein WcfClient-Objekt pro Anruf erstellen möchte (im Gegensatz zu per-WPF-Seite oder pro-Anwendung), also hier ist, was ich mir ausgedacht habe:

%Vor%

Ich finde es schwierig herauszufinden, was der empfohlene Weg ist, um das zu erreichen, was ich gerade implementiert habe. Ist das so, wie es ist, oder gibt es Fallen / Randfälle, um die ich mich kümmern muss? Was ist der goldene Standard, wenn es darum geht, einen WCF-Anruf ordnungsgemäß abzubrechen?

    
Pwninstein 14.06.2010, 17:17
quelle

5 Antworten

6

Es gibt keine Möglichkeit, die asynchrone Anforderung abzubrechen, es sei denn, Sie erstellen die asynchronen Funktionen manuell. Wenn Sie bedenken, dass Sie Ihre WCF-Aufrufe automatisch generieren, ist das lästig. Selbst dann, wie du gesagt hast, der Anruf wird nicht abgebrochen, es wird trotzdem laufen. Wenn Sie immer noch einen Abbruch wünschen, müssen Sie nur sicherstellen, dass der Client / die Benutzerschnittstelle die Ergebnisse des Anrufs ignoriert.

    
bju1046 24.06.2010, 14:42
quelle
11

Der einfachste Weg, dies mit einem WCF-Client zu tun, und das aufgabenbasierte asynchrone Muster besteht darin, eine Abbruchaktion mit dem Abbruch-Token zu registrieren

%Vor%     
Flatliner DOA 28.06.2016 09:32
quelle
4

.Net 4.5

  1. Jede WCF-Aufrufimplementierung erstellt eine CancellationTokenSource und speichert sie an einem Speicherort, der für alle WCF-Dienste zugänglich ist. I.e. in Einzelserverumgebungen kann es sich um einen Zwischenspeicher im Cache handeln.
  2. CancellationTokenSource.Token wird an alle Methodenaufrufe übergeben, die von der WCF-Methode initiiert wurden, einschließlich Aufrufe an Datenbanken und Netzwerkaufrufe (falls zutreffend).
  3. Die WCF-Methode kann eine eindeutige ID als Parameter haben oder eine eindeutige ID zurückgeben, die mit CancellationTokenSource verknüpft ist.
  4. Wenn der Client den Vorgang abbrechen muss, wird eine WCF-Methode aufgerufen und der eindeutige Bezeichner des vorherigen Aufrufs übergeben.
  5. CanceltionTokenSource wird mithilfe der eindeutigen Kennung abgerufen, und die Cancel-Methode wird aufgerufen. Wenn das Stornierungs-Token ordnungsgemäß verarbeitet wird, wird der Vorgang, der von einem vorherigen Anruf gestartet wurde, bald abgebrochen und kann entweder OperationCanceledException oder CancelFault oder einen anderen Fehler zurückgeben, der anzeigt, dass der Client diesen Anruf abgebrochen hat.
  6. Wenn Clientaufrufe in Schritt 4 gleichzeitig abgebrochen werden, kann der ursprüngliche WCF-Aufruf abgebrochen werden. Wenn Clients jedoch OperationCanceledException oder CancelFault ordnungsgemäß verarbeiten, ist dies nicht erforderlich. OperationCanceledException kann sogar zu einem Ajax-Aufruf führen, wenn der ursprüngliche Aufruf von einer Webseite gestartet wurde.

Ähnliches kann auch in älteren .Net-Frameworks implementiert werden, wo CancellationToken noch nicht verfügbar ist.

    
user3285954 13.12.2014 14:03
quelle
2

Das Abbrechen einer Anfrage ist im allgemeinen Sinn nicht wirklich praktisch, einfach aufgrund der asynchronen Art der Anfrage, von der Sie sprechen. Spezifische Problemumgehungen können durchgeführt werden. Z. B. Hinzufügen eines neuen Cancel-Signals zu Ihrem Protokoll, das einen freigegebenen Status festlegt, den Ihre primäre, lang andauernde Aufgabe regelmäßig überprüft, um sicherzustellen, dass sie weiterhin ausgeführt wird.

In jedem Fall bin ich aufgrund der asynchronen Art der Anfrage der Ansicht, dass es immer noch Aufgabe des Kunden ist, die Ergebnisse einer abgebrochenen Anfrage zu ignorieren. Es ist nicht möglich zu garantieren, dass der Client keine Antwort von einer Anfrage erhält, dass er gerade abgesagt wurde, einfach weil ein Rennen zwischen dem Client und dem Server existiert. Es ist möglich, eine zusätzliche Schicht hinzuzufügen, die überwacht, ob etwas abgebrochen wurde und die Antwort einer Anfrage wegwerfen kann, aber das verhindert nicht, dass das Ergebnis an den Client übertragen wird.

    
Greg D 24.06.2010 13:07
quelle
1

Wenn ich Sie richtig verstanden habe, versuchen Sie, einen ausstehenden Anruf bei einem WCF-Dienst korrekt abzubrechen. Sie möchten das Ereignis MyFunctionCompleted verwenden, da es im UI-Thread behandelt wird.

Was Sie wahrscheinlich tun sollten, ist die Methode Abort für WcfClient aufzurufen (Sie müssen einen Verweis darauf behalten). Dies wird Ressourcen auf der Clientseite bereinigen. Der Server wird die Anfrage immer noch abschließen, aber der Client wird nicht mehr darauf warten. Kurz nachdem das Ereignis MyFunctionCompleted ausgelöst wurde. Durch Überprüfen der client.State wissen Sie, ob der Anruf erfolgreich war, fehlgeschlagen ist oder abgebrochen wurde.

Hier ist eine kleine Test-App mit einer Senden-Schaltfläche, einer Abbruch-Schaltfläche und einem Textfeld für die Ergebnisse:

%Vor%

Es gibt keine Ausnahmebehandlung und Bereinigung ... Ich weiß nicht, ob es der empfohlene Weg ist, aber ich denke, ein Abbruch ist der richtige Weg. Sie müssen die verschiedenen Fehlersituationen irgendwie behandeln.

    
BasvdL 25.06.2010 06:29
quelle

Tags und Links