Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Amellett, hogy lehetővé teszi a nyomkövetést a konfigurációban a Windows Communication Foundation (WCF) által létrehozott rendszerállapot-adatok gyűjtéséhez, programozott módon is kibocsáthat nyomkövetéseket a felhasználói kódban. Ily módon proaktív módon hozhat létre olyan rendszerállapot-adatokat, amelyeket később diagnosztikai célokra felhasználhat. Ez a témakör azt ismerteti, hogyan teheti meg ezt.
Emellett a Nyomkövetés kiterjesztése minta az alábbi szakaszokban bemutatott összes kódot tartalmazza.
Nyomkövetési forrás létrehozása
A következő kóddal létrehozhat egy felhasználói nyomkövetési forrást.
TraceSource ts = new TraceSource("myUserTraceSource");
Tevékenységek létrehozása
A tevékenységek a feldolgozás logikai egységei. Minden nagyobb feldolgozási egységhez létrehozhat egy tevékenységet, amelyben a nyomkövetéseket csoportosítani szeretné. Létrehozhat például egy tevékenységet a szolgáltatásnak küldött minden egyes kéréshez. Ehhez hajtsa végre a következő lépéseket.
Mentse el a tevékenységazonosítót a hatókörben.
Hozzon létre egy új tevékenységazonosítót.
Átvitel a hatókörben lévő tevékenységről az újra, állítsa be az új tevékenységet a hatókörben, és adjon ki egy kezdő nyomkövetést az adott tevékenységhez.
Az alábbi kód bemutatja, hogyan teheti ezt meg.
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");
Nyomkövetések kibocsátása egy felhasználói tevékenységen belül
Az alábbi kód nyomkövetéseket bocsát ki egy felhasználói tevékenységen belül.
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 + "'");
A tevékenységek leállítása
A tevékenységek leállításához térjen vissza a régi tevékenységhez, állítsa le az aktuális tevékenységazonosítót, és állítsa alaphelyzetbe a régi tevékenységazonosítót a hatókörben.
Az alábbi kód bemutatja, hogyan teheti ezt meg.
ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;
A tevékenységazonosító propagálása egy szolgáltatásba
Ha a propagateActivity attribútumot true állítja be a System.ServiceModel nyomkövetési forráshoz mind az ügyfél-, mind a szolgáltatáskonfigurációs fájlokban, a hozzáadási kérés feldolgozása ugyanabban a tevékenységben történik, mint az ügyfélben definiált. Ha a szolgáltatás saját tevékenységeket és átviteleket határoz meg, a szolgáltatás nyomkövetései nem jelennek meg az ügyfél által propagált tevékenységben. Ehelyett egy olyan tevékenységben jelennek meg, amely átviteli nyomok által áll kapcsolatban azzal a tevékenységgel, amelynek azonosítóját az ügyfél terjeszti.
Megjegyzés:
Ha az propagateActivity attribútum az ügyfélen és a szolgáltatáson is be van állítva true , a szolgáltatás működési hatókörében a környezeti tevékenységet a WCF állítja be.
Az alábbi kód segítségével ellenőrizheti, hogy a WCF beállított-e egy tevékenységet a hatókörben.
// 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;
Kivételek nyomkövetése a kódban
Ha kivételt ad a kódban, a kivételt figyelmeztetési szinten vagy a következő kód használatával is nyomon követheti.
ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");
Felhasználói nyomkövetések megtekintése a Szolgáltatáskövetés-megjelenítő eszközben
Ez a szakasz képernyőképeket tartalmaz a Nyomkövetés kiterjesztése minta futtatásával létrehozott nyomkövetésekről, amikor a Service Trace Viewer tool (SvcTraceViewer.exe) használatával tekintik meg.
Az alábbi ábrán a korábban létrehozott "Kérelem hozzáadása" tevékenység van kiválasztva a bal oldali panelen. Az alkalmazás-ügyfélprogramot alkotó három további matematikai művelettel (Divide, Subtract, Multiply) együtt szerepel a listán. A felhasználói kód minden művelethez egy új tevékenységet határozott meg, hogy elkülönítse a különböző kérésekben előforduló lehetséges hibaeseményeket.
A nyomkövetés kiterjesztése mintában az átvitelek használatának bemutatásához létrejön egy számológép-tevékenység is, amely a négy műveleti kérést foglalja magában. Minden egyes kérés esetében a Számológép tevékenységről oda-vissza átvitel történik a kérelemtevékenységre (a nyomkövetés a jobb felső panelen van kiemelve az ábrán).
Amikor kiválaszt egy tevékenységet a bal oldali panelen, a tevékenységhez tartozó nyomkövetések a jobb felső panelen jelennek meg. Ha propagateActivity a kérelem útvonalának minden végpontján található true , a kérelemtevékenység nyomkövetései a kérelemben részt vevő összes folyamatból származnak. Ebben a példában a panel 4. oszlopában látható mind az ügyfél, mind a szolgáltatás nyomkövetése.
Ez a tevékenység a következő feldolgozási sorrendet mutatja:
Az ügyfél üzenetet küld a Hozzáadás parancsnak.
A szolgáltatás fogadja a Kérelem hozzáadása üzenetet.
A szolgáltatás küld egy "Hozzáadás" választ.
Az ügyfél kiegészítési választ kap.
Ezek a lenyomatok információ szinten lettek generálva. Ha a jobb felső panelen egy nyomkövetésre kattint, a nyomkövetés részletei láthatók a jobb alsó panelen.
Az alábbi ábrán a Kalkulátor tevékenységből és a Kalkulátor tevékenységbe irányuló átviteli nyomkövetéseket is láthatjuk, valamint minden kérelemtevékenységhez két pár Indítási és Leállítási nyomkövetést: egyet az ügyfélhez és egyet a szolgáltatáshoz (mindkét nyomkövetési forráshoz külön-külön).
Tevékenységek listája létrehozási idő szerint (bal panel) és a beágyazott tevékenységeik (jobb felső panel)
Ha a szolgáltatáskód olyan kivételt dob, amely miatt az ügyfél is kivételt dob (például amikor az ügyfél nem kapja meg a választ a kérésére), a szolgáltatás és az ügyfél hiba- vagy figyelmeztető üzenetei ugyanazon tevékenységben jelennek meg közvetlen korreláció céljából. Az alábbi képen a szolgáltatás kivételt jelez: "A szolgáltatás nem hajlandó feldolgozni ezt a kérést a felhasználói kódban". Az ügyfél kivételt is jelez, amely szerint "A kiszolgáló belső hiba miatt nem tudta feldolgozni a kérést".
Az alábbi képek azt mutatják, hogy az adott kérés végpontjai közötti hibák ugyanabban a tevékenységben jelennek meg, ha a kérelem tevékenységazonosítóját propagálták:
A bal oldali panelen a Szorzás tevékenységre duplán kattintva az alábbi grafikon látható, amelyen az egyes folyamatok szorzási tevékenységének nyomkövetései láthatók. Először figyelmeztetés jelenik meg a szolgáltatásban (kivétel történt), amelyet figyelmeztetések és hibák követnek az ügyfélen, mert a kérést nem sikerült feldolgozni. Ezért utalhatunk a végpontok közötti oksági hiba kapcsolatára, és levezethetjük a hiba kiváltó okát.
Az alábbi képen a hiba korrelációjának gráfnézete látható:
Az előző nyomkövetések beszerzéséhez meg kell adni ActivityTracing a felhasználói nyomkövetési forrásokat és propagateActivity=true a nyomkövetési System.ServiceModel forrást. Nem állítottuk be a ActivityTracing-t a System.ServiceModel nyomkövetési forráshoz, hogy lehetővé tegyük a felhasználói kódok közötti tevékenység propagálását. (Ha a ServiceModel-tevékenység nyomkövetése be van kapcsolva, az ügyfélben definiált tevékenységazonosítót a rendszer nem propagálja egészen a szolgáltatásfelhasználói kódig; Az átvitelek azonban korrelálják az ügyfél- és szolgáltatásfelhasználói kódtevékenységeket a köztes WCF-tevékenységekhez.)
A tevékenységek definiálása és a tevékenységazonosító propagálása lehetővé teszi a végpontok közötti közvetlen hibakorrelációt. Így gyorsabban megtalálhatjuk a hiba kiváltó okát.