Sdílet prostřednictvím


Přepojit

Toto téma popisuje přenos v modelu trasování aktivit WCF (Windows Communication Foundation).

Definice přenosu

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">  

Použití přenosu ke korelaci aktivit v rámci koncových bodů

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.

Příklad převodů

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

Posloupnost přenosu aktivity ve správném formátu zahrnuje následující kroky.

  1. Zahajte novou aktivitu, která se skládá z výběru nového id GAId.

  2. Generování trasování přenosu do této nové hodnoty gAId z id aktuální aktivity

  3. Nastavení nového ID v protokolu TLS

  4. Vygenerujte počáteční trasování, které označuje začátek nové aktivity.

  5. Návrat k původní aktivitě se skládá z následujících:

  6. Generování trasování přenosu do původního id GAId

  7. Vygenerování trasování zastavení označující konec nové aktivity

  8. 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);  

Viz také