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.
Zusätzlich zum Aktivieren der Ablaufverfolgung in der Konfiguration zum Sammeln von Instrumentierungsdaten, die von Windows Communication Foundation (WCF) generiert wurden, lassen sich Ablaufverfolgungen auch programmgesteuert in Benutzercode ausgeben. Auf diese Weise können Sie proaktiv Instrumentierungsdaten erstellen, die Sie später zur Diagnose verwenden können. In diesem Thema wird erläutert, wie Sie dazu vorgehen können.
Darüber hinaus finden Sie im Beispiel Erweitern der Ablaufverfolgung sämtlichen in den folgenden Abschnitten gezeigten Code.
Erstellen einer Ablaufverfolgungsquelle
Sie können den folgenden Code verwenden, um eine Benutzerablaufverfolgungsquelle zu erstellen.
TraceSource ts = new TraceSource("myUserTraceSource");
Erstellen von Aktivitäten
Aktivitäten sind logische Verarbeitungseinheit. Für jede größere Verarbeitungseinheit, in der Ablaufverfolgungen gruppiert werden sollen, kann eine Aktivität erstellt werden. Sie können beispielsweise eine Aktivität für jede Anforderung an den Dienst erstellen. Führen Sie dazu die folgenden Schritte aus.
Speichern Sie die Aktivitäts-ID des Bereichs.
Erstellen Sie eine neue Aktivitäts-ID.
Wechseln Sie von der Aktivität des Bereichs zur neuen Aktivität, legen Sie die neue Aktivität für den Bereich fest, und geben Sie für diese Aktivität eine Start-Ablaufverfolgung aus.
Der folgende Code veranschaulicht, wie dies funktioniert.
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
Ausgeben von Ablaufverfolgungen innerhalb einer Benutzeraktivität
Der folgende Code dient zum Ausgeben von Ablaufverfolgungen innerhalb einer Benutzeraktivität:
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");
Beenden der Aktivitäten
Um die Aktivitäten zu beenden, wechseln Sie zurück zur alten Aktivität, beenden Sie die aktuelle Aktivität, und setzen Sie die alte Aktivitäts-ID im Geltungsbereich zurück.
Der folgende Code veranschaulicht, wie dies funktioniert.
ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;
Weitergeben der Aktivitäts-ID an einen Dienst
Wird das propagateActivity
-Attribut für die true
-Ablaufverfolgungsquelle sowohl in der Konfigurationsdatei des Clients als auch in der Konfigurationsdatei des Diensts auf System.ServiceModel
festgelegt, erfolgt die Dienstverarbeitung für die Add-Anforderung in der Aktivität, die auch für den Client definiert ist. Wenn der Dienst seine eigenen Aktivitäten und Übertragungen definiert, erscheinen die Dienstprotokolle nicht in der vom Client weitergegebenen Aktivität. Stattdessen treten sie in einer Aktivität auf, die über Übertragungsprotokoll mit der Aktivität korreliert ist, deren ID vom Client weitergegeben wird.
Hinweis
Wenn das propagateActivity
Attribut sowohl beim Client als auch beim Dienst auf true
festgelegt ist, wird die Umgebungsaktivität im Vorgangsbereich des Dienstes von WCF festgelegt.
Mit dem folgenden Code können Sie überprüfen, ob eine Aktivität im Bereich von WCF festgelegt wurde.
// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
Guid newGuid = Guid.NewGuid();
Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");
// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
+ n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);
// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;
Verfolgen von im Code ausgelösten Ausnahmen
Wenn Sie eine Ausnahme im Code auslösen, können Sie die Ausnahme auf Warn-Level oder höher nachverfolgen, indem Sie den folgenden Code verwenden.
ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");
Anzeigen von Benutzerablaufverfolgungen im Service Trace Viewer-Tool
Dieser Abschnitt enthält Screenshots von Ablaufverfolgungen, die durch Ausführen des Beispiels zum Erweitern der Ablaufverfolgung generiert werden, wenn sie mithilfe des Dienstablaufverfolgungs-Viewer-Tools (SvcTraceViewer.exe) angezeigt werden.
Im folgenden Diagramm wird die zuvor erstellte Aktivität "Anforderung hinzufügen" im linken Bereich ausgewählt. Es wird mit drei weiteren mathematischen Vorgangsaktivitäten (Dividieren, Subtrahieren, Multiplizieren) aufgeführt, die das Anwendungsclientprogramm bilden. Der Benutzercode hat eine neue Aktivität für jeden Vorgang definiert, um potenzielle Fehlervorkommnisse in verschiedenen Anforderungen zu isolieren.
Zur Veranschaulichung der Verwendung von Übertragungen im Beispiel für das Beispiel Erweitern der Ablaufverfolgung wird auch eine Berechnungsaktivität erstellt, die die vier Vorgangsanforderungen enthält. Für jede Anforderung findet eine Übertragung von der Berechnungsaktivität zur Anforderungsaktivität und umgekehrt statt (die Ablaufverfolgung ist im rechten oberen Bereich der Abbildung hervorgehoben).
Wenn Sie eine Aktivität im linken Bereich auswählen, werden die in dieser Aktivität enthaltenen Ablaufverfolgungen im oberen rechten Bereich angezeigt. Ist propagateActivity
an jedem Endpunkt des Anforderungspfads true
, stammen die Ablaufverfolgungen in der Anforderungsaktivität von allen Prozessen, die Teil der Anforderung sind. In diesem Beispiel sind sowohl Ablaufverfolgungen vom Client als auch vom Dienst enthalten (siehe 4. Spalte des Bereichs).
Diese Aktivität zeigt die folgende Reihenfolge der Verarbeitung:
Der Client sendet eine Nachricht an Add.
Dienst empfängt Nachricht mit Add-Anforderung.
Dienst sendet Add-Antwort.
Client empfängt Add-Antwort.
All diese Ablaufverfolgungen werden auf Informationsebene ausgegeben. Wenn Sie im oberen rechten Bereich auf eine Spur klicken, werden die Details dieser Spur im unteren rechten Bereich angezeigt.
Im folgenden Diagramm sind auch Übertragungsablaufverfolgungen von der und zur Berechnungsaktivität sowie zwei Paare von Start- und Stop-Ablaufverfolgungen pro Anforderungsaktivität enthalten (eins für den Client, eins für den Dienst, also jeweils eins für jede Ablaufverfolgungsquelle).
Liste der Aktivitäten nach Erstellungszeit (linker Bereich) und deren geschachtelter Aktivitäten (Bereich rechts oben)
Wenn der Dienstcode eine Ausnahme auslöst, die dazu führt, dass der Client auch eine Ausnahme erhält (z. B. wenn der Client keine Antwort auf seine Anfrage bekommt), erscheinen sowohl die Warn- als auch die Fehlermeldungen des Dienstes und des Clients in derselben Aktivität, wodurch eine direkte Korrelation ermöglicht wird. In der folgenden Abbildung löst der Dienst eine Ausnahme aus, die besagt: "Der Dienst lehnt die Verarbeitung dieser Anforderung im Benutzercode ab." Der Client löst auch eine Ausnahme aus, die besagt: "Der Server konnte die Anforderung aufgrund eines internen Fehlers nicht verarbeiten."
Die folgenden Abbildungen zeigen, dass Fehler über Endpunkte hinweg für eine bestimmte Anforderung in derselben Aktivität angezeigt werden, wenn die Anforderungsaktivitäts-ID weitergegeben wurde:
Durch Doppelklicken auf die Aktivität 'Multiplizieren' im linken Panel wird das folgende Diagramm mit den Ablaufverfolgungen für diese Aktivität bei jedem beteiligten Prozess angezeigt. Es wird eine Warnung angezeigt, die zuerst beim Dienst aufgetreten ist (Ausnahme ausgelöst), gefolgt von Warnungen und Fehlern auf dem Client, da die Anforderung nicht verarbeitet werden konnte. Daher können wir die kausale Fehlerbeziehung zwischen Endpunkten implizieren und die Ursache des Fehlers ableiten.
Die folgende Abbildung zeigt eine Diagrammansicht der Fehlerkorrelation:
Um die vorherigen Ablaufverfolgungen abzurufen, setzen wir ActivityTracing
für die Benutzerablaufverfolgungsquellen und propagateActivity=true
für die Ablaufverfolgungsquelle System.ServiceModel
. ActivityTracing
wurde nicht für die System.ServiceModel
-Ablaufverfolgungsquelle festgelegt, um die Aktivitätsweitergabe von Benutzercode an Benutzercode zu ermöglichen. (Wenn die ServiceModel-Aktivitätsablaufverfolgung aktiviert ist, wird die im Client definierte Aktivitäts-ID nicht vollständig an den Dienstbenutzercode weitergegeben; Übertragungen korrelieren jedoch die Client- und Dienstbenutzercodeaktivitäten mit den zwischengeschalteten WCF-Aktivitäten.)
Das Definieren von Aktivitäten und das Verteilen der Aktivitäts-ID ermöglicht es uns, eine direkte Fehlerkorrelation über Endpunkte hinweg durchzuführen. Auf diese Weise können wir die Ursache eines Fehlers schneller finden.