Přepojit
Toto téma popisuje přenos v modelu trasování aktivit WCF (Windows Communication Foundation).
Přenosy mezi aktivitami představují kauzální vztahy mezi událostmi v souvisejících aktivitách v rámci koncových bodů. Dvě aktivity souvisejí s přenosy při řízení toků mezi těmito aktivitami, například volání metody přes hranice aktivit. Když jsou ve službě příchozí bajty, aktivita Listen At je přenesena do aktivity Receive Bytes, kde je objekt zprávy vytvořen. Seznam scénářů komplexního trasování a jejich odpovídající návrh aktivity a trasování najdete v tématu Kompletní scénáře trasování.
Pokud chcete generovat trasování přenosu, použijte ActivityTracing
nastavení zdroje trasování, jak ukazuje následující konfigurační kód.
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
Aktivity a přenosy umožňují uživateli probabilisticky vyhledat původní příčinu chyby. Pokud například přeneseme mezi aktivitami M a N v komponentách M a N a dojde k chybovému ukončení v N hned po přenosu zpět do M, můžeme nakreslit závěr, že je pravděpodobné, že N předává data zpět do M.
Trasování přenosu se vygeneruje z aktivity M do aktivity N, pokud mezi M a N existuje tok řízení. Například N provádí určitou práci pro M kvůli volání metody překračující hranice aktivit. Je možné, že N již existuje nebo je vytvořen. N se vytvoří V, když N je nová aktivita, která provádí určitou práci pro M.
Přenos z M do N nemusí následovat přenos zpět z N do M. Je to proto, že M může vytvořit určitou práci v N a nesledovat, kdy N tuto práci dokončí. M může ve skutečnosti ukončit před dokončením úkolu N. K tomu dochází v aktivitě "Open ServiceHost" (M), která vytváří aktivity naslouchacího procesu (N) a poté se ukončí. Přenos zpět z N do M znamená, že N dokončil práci související s M.
N může pokračovat v provádění jiného zpracování nesouvisejícího s M, například stávající ověřovací aktivitou (N), která stále přijímá žádosti o přihlášení (M) z různých aktivit přihlášení.
Vztah vnoření nemusí nutně existovat mezi aktivitami M a N. K tomu může dojít ze dvou důvodů. Za prvé, když aktivita M nemonitoruje skutečné zpracování prováděné v N, i když M inicioval N. Za druhé, pokud už N existuje.
Následující seznam obsahuje dva příklady přenosu.
Při vytváření hostitele služby získá konstruktor kontrolu z volajícího kódu nebo volající kód přenese do konstruktoru. Po dokončení provádění konstruktoru vrátí ovládací prvek volajícímu kódu nebo konstruktor přenese zpět do volajícího kódu. Jedná se o případ vnořené relace.
Když naslouchací proces začne zpracovávat přenosová data, vytvoří nové vlákno a předá aktivitu Příjmové bajty odpovídající kontext pro zpracování, předávání řízení a dat. Jakmile vlákno dokončí zpracování požadavku, aktivita Receive Bytes předá do naslouchacího procesu nic zpět. V tomto případě máme přenos, ale žádný přenos z nové aktivity vlákna. Dvě aktivity souvisejí, ale nejsou vnořené.
Posloupnost přenosu aktivity ve správném formátu zahrnuje následující kroky.
Zahajte novou aktivitu, která se skládá z výběru nového id GAId.
Generování trasování přenosu do této nové hodnoty gAId z id aktuální aktivity
Nastavení nového ID v protokolu TLS
Vygenerujte počáteční trasování, které označuje začátek nové aktivity.
Návrat k původní aktivitě se skládá z následujících:
Generování trasování přenosu do původního id GAId
Vygenerování trasování zastavení označující konec nové aktivity
Nastavte protokol TLS na starý identifikátor gAId.
Následující příklad kódu ukazuje, jak to provést. Tato ukázka předpokládá, že se při přenosu na novou aktivitu provádí blokující volání a zahrnuje trasování pozastavení a obnovení.
// 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);