Overdracht
In dit onderwerp wordt de overdracht beschreven in het WCF-activiteitentraceringsmodel (Windows Communication Foundation).
Definitie overdragen
Overdrachten tussen activiteiten vertegenwoordigen causale relaties tussen gebeurtenissen in de gerelateerde activiteiten binnen eindpunten. Twee activiteiten zijn gerelateerd aan overdrachten wanneer controlestromen tussen deze activiteiten worden uitgevoerd, bijvoorbeeld een methode die grensoverschrijdende activiteiten aanroept. Wanneer in WCF bytes binnenkomen op de service, wordt de activiteit Listen At overgebracht naar de activiteit Bytes ontvangen waar het berichtobject wordt gemaakt. Zie end-to-end traceringsscenario's voor een lijst met end-to-end-traceringsscenario's en het bijbehorende ontwerp voor activiteiten en tracering.
Als u overdrachtstraceringen wilt verzenden, gebruikt u de ActivityTracing
instelling voor de traceringsbron, zoals wordt gedemonstreerd door de volgende configuratiecode.
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
Overdracht gebruiken om activiteiten binnen eindpunten te correleren
Met activiteiten en overdrachten kan de gebruiker de hoofdoorzaak van een fout probabilistisch vinden. Als we bijvoorbeeld heen en weer schakelen tussen activiteiten M en N in onderdelen M en N en een crash in N direct na de overdracht naar M, kunnen we de conclusie trekken dat het waarschijnlijk is dat N gegevens teruggeeft aan M.
Een overdrachtstracering wordt verzonden van activiteit M naar activiteit N wanneer er een controlestroom tussen M en N is. N voert bijvoorbeeld werk uit voor M vanwege een methode-aanroep die de grenzen van de activiteiten overschrijdt. N bestaat mogelijk al of is gemaakt. N wordt door M gehaald wanneer N een nieuwe activiteit is die werk uitvoert voor M.
Een overdracht van M naar N kan niet worden gevolgd door een overdracht van N naar M. Dit komt doordat M werk in N kan spawnen en niet kan bijhouden wanneer N dat werk voltooit. M kan zelfs beëindigen voordat N zijn taak voltooit. Dit gebeurt in de activiteit 'Open ServiceHost' (M) die listener-activiteiten (N) spawn en vervolgens wordt beëindigd. Een overdracht van N naar M betekent dat N het werk met betrekking tot M heeft voltooid.
N kan doorgaan met het uitvoeren van andere verwerkingen die niet gerelateerd zijn aan M, bijvoorbeeld een bestaande verificatoractiviteit (N) die aanmeldingsaanvragen (M) van verschillende aanmeldingsactiviteiten blijft ontvangen.
Er bestaat niet noodzakelijkerwijs een geneste relatie tussen activiteiten M en N. Dit kan om twee redenen gebeuren. Eerst controleert activiteit M niet de werkelijke verwerking die in N wordt uitgevoerd, hoewel M geïnitieerde N. Ten tweede, wanneer N al bestaat.
Voorbeeld van overdrachten
Hieronder vindt u twee overdrachtsvoorbeelden.
Wanneer u een servicehost maakt, krijgt de constructor controle over de aanroepende code of de aanroepende code wordt overgedragen naar de constructor. Wanneer de constructor klaar is met uitvoeren, wordt het besturingselement teruggezet naar de aanroepende code of wordt de constructor teruggezet naar de aanroepende code. Dit is het geval van een geneste relatie.
Wanneer een listener begint met het verwerken van transportgegevens, wordt er een nieuwe thread gemaakt en wordt de activiteit Bytes ontvangen de juiste context voor verwerking, controle en gegevens doorgegeven. Wanneer deze thread klaar is met het verwerken van de aanvraag, geeft de activiteit Bytes ontvangen niets terug aan de listener. In dit geval hebben we een overdracht, maar geen overdracht van de nieuwe threadactiviteit. De twee activiteiten zijn gerelateerd, maar niet genest.
Volgorde van activiteitsoverdracht
Een goed gevormde reeks activiteitsoverdracht omvat de volgende stappen.
Begin een nieuwe activiteit, die bestaat uit het selecteren van een nieuwe gAId.
Een overdrachtstracering verzenden naar die nieuwe gAId vanaf de huidige activiteits-id
De nieuwe id instellen in TLS
Een begintracering verzenden om het begin van de nieuwe activiteit aan te geven.
Terugkeren naar de oorspronkelijke activiteit bestaat uit het volgende:
Een overdrachtstracering verzenden naar de oorspronkelijke gAId
Een stoptracering verzenden om het einde van de nieuwe activiteit aan te geven
Stel TLS in op de oude gAId.
In het volgende codevoorbeeld ziet u hoe u dit doet. In dit voorbeeld wordt ervan uitgegaan dat er een blokkeringsoproep wordt uitgevoerd bij het overzetten naar de nieuwe activiteit en dat er traceringen voor onderbreken/hervatten worden opgenomen.
// 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);