Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird die Übertragung im Wcf-Aktivitätsablaufverfolgungsmodell (Windows Communication Foundation) beschrieben.
Übertragungsdefinition
Übertragungen zwischen Aktivitäten stellen kausale Beziehungen zwischen Ereignissen in den zugehörigen Aktivitäten innerhalb von Endpunkten dar. Zwei Aktivitäten stehen im Zusammenhang mit Übertragungen, wenn Steuerungsflüsse zwischen diesen Aktivitäten stattfinden, z. B. ein Methodenaufruf, der Aktivitätsgrenzen überschreitet. In WCF wird, wenn Bytes in den Dienst eingehen, die Listen At-Aktivität an die Aktivität "Empfangen von Bytes" übertragen, in der das Nachrichtenobjekt erstellt wird. Eine Liste von durchgängigen Ablaufverfolgungsszenarien und deren entsprechende Aktivität und den Ablaufverfolgungsentwurf finden Sie unter End-to-End-Ablaufverfolgungsszenarien.
Um Übertragungsablaufverfolgungen auszugeben, verwenden Sie die ActivityTracing-Einstellung auf der Ablaufverfolgungsquelle, wie im folgenden Konfigurationscode gezeigt.
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
Verwenden der Übertragung zum Korrelieren von Aktivitäten innerhalb von Endpunkten
Aktivitäten und Übertragungen ermöglichen es dem Benutzer, die Ursache eines Fehlers probabilistisch zu finden. Wenn wir zum Beispiel zwischen den Aktivitäten M und N in den Komponenten M und N hin- und herwechseln, und es kommt direkt nach dem Wechsel zurück zu M zu einem Absturz in N, können wir den Schluss ziehen, dass dies wahrscheinlich darauf zurückzuführen ist, dass N Daten an M überträgt.
Eine Übertragungsablaufverfolgung wird von Aktivität M an Aktivität N ausgegeben, wenn ein Steuerungsfluss zwischen M und N besteht. Beispielsweise führt N aufgrund eines Methodenaufrufs über die Aktivitätsgrenzen hinweg Arbeit für M aus. N ist möglicherweise bereits vorhanden oder wurde erstellt. N wird von M spawniert, wenn N eine neue Aktivität ist, die einige Arbeit für M ausführt.
Nach der Übertragung von M zu N erfolgt möglicherweise keine Rückübertragung von N zu M. Dies liegt daran, dass M Arbeit in N erstellen kann und nicht nachverfolgt, wann N die Arbeit abgeschlossen hat. M kann tatsächlich beendet werden, bevor N seine Aufgabe abgeschlossen hat. Dies geschieht in der "Open ServiceHost"-Aktivität (M), die Listeneraktivitäten (N) erzeugt und dann beendet. Ein Transfer von N nach M bedeutet, dass N die Arbeit im Zusammenhang mit M abgeschlossen hat.
N kann weiterhin andere Verarbeitungen ausführen, die nicht im Zusammenhang mit M stehen, z. B. eine vorhandene Authentifikatoraktivität (N), die Anmeldeanforderungen (M) aus verschiedenen Anmeldeaktivitäten empfängt.
Zwischen den Aktivitäten M und N besteht nicht zwingend eine Schachtelungsbeziehung. Dies kann aus zwei Gründen der Fall sein. Erstens, wenn Aktivität M die tatsächliche Verarbeitung, die in N ausgeführt wird, nicht überwacht, obwohl M N initiiert hat. Zweitens, wenn N bereits vorhanden ist.
Beispiel für Übertragungen
Im Folgenden werden zwei Übertragungsbeispiele aufgeführt.
Wenn Sie einen Diensthost erstellen, erhält der Konstruktor die Kontrolle über den aufrufenden Code, oder der aufrufende Code wird an den Konstruktor übertragen. Wenn der Konstruktor die Ausführung abgeschlossen hat, gibt er die Steuerung an den aufrufenden Code zurück, oder der Konstruktor wechselt zurück an den aufrufenden Code. Dies ist der Fall einer geschachtelten Beziehung.
Wenn ein Listener mit der Verarbeitung von Transportdaten beginnt, erstellt er einen neuen Thread und übergibt der Aktivität 'Bytes empfangen' den entsprechenden Kontext für die Verarbeitung, wobei Steuerung und Daten übergeben werden. Wenn dieser Thread die Verarbeitung der Anforderung abgeschlossen hat, übergibt die Aktivität "Empfangen von Bytes" nichts an den Listener. In diesem Fall haben wir eine Übertragung in die neue Threadaktivität, aber keine heraus. Die beiden Aktivitäten sind verknüpft, aber nicht geschachtelt.
Aktivitätsübertragungssequenz
Eine wohlgeformte Aktivitätsübertragungssequenz umfasst die folgenden Schritte.
Beginnen Sie eine neue Aktivität, die aus der Auswahl einer neuen gAId besteht.
Geben Sie eine Übertragungsablaufverfolgung zu dieser neuen gAId von der aktuellen Aktivitäts-ID aus.
Festlegen der neuen ID in TLS
Geben Sie eine Start-Ablaufverfolgung aus, um den Beginn der neuen Aktivität festzulegen.
Die Rückkehr zur ursprünglichen Aktivität besteht aus folgenden Komponenten:
Ausgabe einer Übertragungsablaufverfolgung zur Original-gAId
Eine Stopp-Trace senden, um das Ende der neuen Aktivität anzuzeigen
Legen Sie TLS auf die alte gAId fest.
Im folgenden Codebeispiel wird dies veranschaulicht. Bei diesem Beispiel wird davon ausgegangen, dass ein Sperraufruf bei der Übertragung zur neuen Aktivität ausgelöst wurde, und es enthält Suspend-/Resume-Ablaufverfolungen.
// 0. Create a trace source
TraceSource ts = new TraceSource("myTS");
// 1. remember existing ("ambient") activity for clean up
Guid oldGuid = Trace.CorrelationManager.ActivityId;
// this will be our new activity
Guid newGuid = Guid.NewGuid();
// 2. call transfer, indicating that we are switching to the new AID
ts.TraceTransfer(667, "Transferring.", newGuid);
// 3. Suspend the current activity.
ts.TraceEvent(TraceEventType.Suspend, 667, "Suspend: Activity " + i-1);
// 4. set the new AID in TLS
Trace.CorrelationManager.ActivityId = newGuid;
// 5. Emit the start trace
ts.TraceEvent(TraceEventType.Start, 667, "Boundary: Activity " + i);
// trace something
ts.TraceEvent(TraceEventType.Information, 667, "Hello from activity " + i);
// Perform Work
// some work.
// Return
ts.TraceEvent(TraceEventType.Information, 667, "Work complete on activity " + i);
// 6. Emit the transfer returning to the original activity
ts.TraceTransfer(667, "Transferring Back.", oldGuid);
// 7. Emit the End trace
ts.TraceEvent(TraceEventType.Stop, 667, "Boundary: Activity " + i);
// 8. Change the tls variable to the original AID
Trace.CorrelationManager.ActivityId = oldGuid;
// 9. Resume the old activity
ts.TraceEvent(TraceEventType.Resume, 667, "Resume: Activity " + i-1);