TraceUtility.cs 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. //----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Diagnostics
  5. {
  6. using System.Diagnostics;
  7. using System.Reflection;
  8. using System.Runtime;
  9. using System.Runtime.CompilerServices;
  10. using System.Runtime.Diagnostics;
  11. using System.ServiceModel.Channels;
  12. using System.ServiceModel.Dispatcher;
  13. using System.Threading;
  14. using System.Security;
  15. using System.ServiceModel.Configuration;
  16. using System.ServiceModel.Activation;
  17. using System.Xml;
  18. using System.ServiceModel.Diagnostics.Application;
  19. using System.Globalization;
  20. using System.Collections.Generic;
  21. static class TraceUtility
  22. {
  23. const string ActivityIdKey = "ActivityId";
  24. const string AsyncOperationActivityKey = "AsyncOperationActivity";
  25. const string AsyncOperationStartTimeKey = "AsyncOperationStartTime";
  26. static bool shouldPropagateActivity;
  27. static bool shouldPropagateActivityGlobal;
  28. static bool activityTracing;
  29. static bool messageFlowTracing;
  30. static bool messageFlowTracingOnly;
  31. static long messageNumber = 0;
  32. static Func<Action<AsyncCallback, IAsyncResult>> asyncCallbackGenerator;
  33. static SortedList<int, string> traceCodes = new SortedList<int, string>(382)
  34. {
  35. // Administration trace codes (TraceCode.Administration)
  36. { TraceCode.WmiPut, "WmiPut" },
  37. // Diagnostic trace codes (TraceCode.Diagnostics)
  38. { TraceCode.AppDomainUnload, "AppDomainUnload" },
  39. { TraceCode.EventLog, "EventLog" },
  40. { TraceCode.ThrowingException, "ThrowingException" },
  41. { TraceCode.TraceHandledException, "TraceHandledException" },
  42. { TraceCode.UnhandledException, "UnhandledException" },
  43. { TraceCode.FailedToAddAnActivityIdHeader, "FailedToAddAnActivityIdHeader" },
  44. { TraceCode.FailedToReadAnActivityIdHeader, "FailedToReadAnActivityIdHeader" },
  45. { TraceCode.FilterNotMatchedNodeQuotaExceeded, "FilterNotMatchedNodeQuotaExceeded" },
  46. { TraceCode.MessageCountLimitExceeded, "MessageCountLimitExceeded" },
  47. { TraceCode.DiagnosticsFailedMessageTrace, "DiagnosticsFailedMessageTrace" },
  48. { TraceCode.MessageNotLoggedQuotaExceeded, "MessageNotLoggedQuotaExceeded" },
  49. { TraceCode.TraceTruncatedQuotaExceeded, "TraceTruncatedQuotaExceeded" },
  50. { TraceCode.ActivityBoundary, "ActivityBoundary" },
  51. // Serialization trace codes (TraceCode.Serialization)
  52. { TraceCode.ElementIgnored, "" }, // shared by ServiceModel, need to investigate if should put this one in the SM section
  53. // Channels trace codes (TraceCode.Channels)
  54. { TraceCode.ConnectionAbandoned, "ConnectionAbandoned" },
  55. { TraceCode.ConnectionPoolCloseException, "ConnectionPoolCloseException" },
  56. { TraceCode.ConnectionPoolIdleTimeoutReached, "ConnectionPoolIdleTimeoutReached" },
  57. { TraceCode.ConnectionPoolLeaseTimeoutReached, "ConnectionPoolLeaseTimeoutReached" },
  58. { TraceCode.ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached, "ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached" },
  59. { TraceCode.ServerMaxPooledConnectionsQuotaReached, "ServerMaxPooledConnectionsQuotaReached" },
  60. { TraceCode.EndpointListenerClose, "EndpointListenerClose" },
  61. { TraceCode.EndpointListenerOpen, "EndpointListenerOpen" },
  62. { TraceCode.HttpResponseReceived, "HttpResponseReceived" },
  63. { TraceCode.HttpChannelConcurrentReceiveQuotaReached, "HttpChannelConcurrentReceiveQuotaReached" },
  64. { TraceCode.HttpChannelMessageReceiveFailed, "HttpChannelMessageReceiveFailed" },
  65. { TraceCode.HttpChannelUnexpectedResponse, "HttpChannelUnexpectedResponse" },
  66. { TraceCode.HttpChannelRequestAborted, "HttpChannelRequestAborted" },
  67. { TraceCode.HttpChannelResponseAborted, "HttpChannelResponseAborted" },
  68. { TraceCode.HttpsClientCertificateInvalid, "HttpsClientCertificateInvalid" },
  69. { TraceCode.HttpsClientCertificateNotPresent, "HttpsClientCertificateNotPresent" },
  70. { TraceCode.NamedPipeChannelMessageReceiveFailed, "NamedPipeChannelMessageReceiveFailed" },
  71. { TraceCode.NamedPipeChannelMessageReceived, "NamedPipeChannelMessageReceived" },
  72. { TraceCode.MessageReceived, "MessageReceived" },
  73. { TraceCode.MessageSent, "MessageSent" },
  74. { TraceCode.RequestChannelReplyReceived, "RequestChannelReplyReceived" },
  75. { TraceCode.TcpChannelMessageReceiveFailed, "TcpChannelMessageReceiveFailed" },
  76. { TraceCode.TcpChannelMessageReceived, "TcpChannelMessageReceived" },
  77. { TraceCode.ConnectToIPEndpoint, "ConnectToIPEndpoint" },
  78. { TraceCode.SocketConnectionCreate, "SocketConnectionCreate" },
  79. { TraceCode.SocketConnectionClose, "SocketConnectionClose" },
  80. { TraceCode.SocketConnectionAbort, "SocketConnectionAbort" },
  81. { TraceCode.SocketConnectionAbortClose, "SocketConnectionAbortClose" },
  82. { TraceCode.PipeConnectionAbort, "PipeConnectionAbort" },
  83. { TraceCode.RequestContextAbort, "RequestContextAbort" },
  84. { TraceCode.ChannelCreated, "ChannelCreated" },
  85. { TraceCode.ChannelDisposed, "ChannelDisposed" },
  86. { TraceCode.ListenerCreated, "ListenerCreated" },
  87. { TraceCode.ListenerDisposed, "ListenerDisposed" },
  88. { TraceCode.PrematureDatagramEof, "PrematureDatagramEof" },
  89. { TraceCode.MaxPendingConnectionsReached, "MaxPendingConnectionsReached" },
  90. { TraceCode.MaxAcceptedChannelsReached, "MaxAcceptedChannelsReached" },
  91. { TraceCode.ChannelConnectionDropped, "ChannelConnectionDropped" },
  92. { TraceCode.HttpAuthFailed, "HttpAuthFailed" },
  93. { TraceCode.NoExistingTransportManager, "NoExistingTransportManager" },
  94. { TraceCode.IncompatibleExistingTransportManager, "IncompatibleExistingTransportManager" },
  95. { TraceCode.InitiatingNamedPipeConnection, "InitiatingNamedPipeConnection" },
  96. { TraceCode.InitiatingTcpConnection, "InitiatingTcpConnection" },
  97. { TraceCode.OpenedListener, "OpenedListener" },
  98. { TraceCode.SslClientCertMissing, "SslClientCertMissing" },
  99. { TraceCode.StreamSecurityUpgradeAccepted, "StreamSecurityUpgradeAccepted" },
  100. { TraceCode.TcpConnectError, "TcpConnectError" },
  101. { TraceCode.FailedAcceptFromPool, "FailedAcceptFromPool" },
  102. { TraceCode.FailedPipeConnect, "FailedPipeConnect" },
  103. { TraceCode.SystemTimeResolution, "SystemTimeResolution" },
  104. { TraceCode.PeerNeighborCloseFailed, "PeerNeighborCloseFailed" },
  105. { TraceCode.PeerNeighborClosingFailed, "PeerNeighborClosingFailed" },
  106. { TraceCode.PeerNeighborNotAccepted, "PeerNeighborNotAccepted" },
  107. { TraceCode.PeerNeighborNotFound, "PeerNeighborNotFound" },
  108. { TraceCode.PeerNeighborOpenFailed, "PeerNeighborOpenFailed" },
  109. { TraceCode.PeerNeighborStateChanged, "PeerNeighborStateChanged" },
  110. { TraceCode.PeerNeighborStateChangeFailed, "PeerNeighborStateChangeFailed" },
  111. { TraceCode.PeerNeighborMessageReceived, "PeerNeighborMessageReceived" },
  112. { TraceCode.PeerNeighborManagerOffline, "PeerNeighborManagerOffline" },
  113. { TraceCode.PeerNeighborManagerOnline, "PeerNeighborManagerOnline" },
  114. { TraceCode.PeerChannelMessageReceived, "PeerChannelMessageReceived" },
  115. { TraceCode.PeerChannelMessageSent, "PeerChannelMessageSent" },
  116. { TraceCode.PeerNodeAddressChanged, "PeerNodeAddressChanged" },
  117. { TraceCode.PeerNodeOpening, "PeerNodeOpening" },
  118. { TraceCode.PeerNodeOpened, "PeerNodeOpened" },
  119. { TraceCode.PeerNodeOpenFailed, "PeerNodeOpenFailed" },
  120. { TraceCode.PeerNodeClosing, "PeerNodeClosing" },
  121. { TraceCode.PeerNodeClosed, "PeerNodeClosed" },
  122. { TraceCode.PeerFloodedMessageReceived, "PeerFloodedMessageReceived" },
  123. { TraceCode.PeerFloodedMessageNotPropagated, "PeerFloodedMessageNotPropagated" },
  124. { TraceCode.PeerFloodedMessageNotMatched, "PeerFloodedMessageNotMatched" },
  125. { TraceCode.PnrpRegisteredAddresses, "PnrpRegisteredAddresses" },
  126. { TraceCode.PnrpUnregisteredAddresses, "PnrpUnregisteredAddresses" },
  127. { TraceCode.PnrpResolvedAddresses, "PnrpResolvedAddresses" },
  128. { TraceCode.PnrpResolveException, "PnrpResolveException" },
  129. { TraceCode.PeerReceiveMessageAuthenticationFailure, "PeerReceiveMessageAuthenticationFailure" },
  130. { TraceCode.PeerNodeAuthenticationFailure, "PeerNodeAuthenticationFailure" },
  131. { TraceCode.PeerNodeAuthenticationTimeout, "PeerNodeAuthenticationTimeout" },
  132. { TraceCode.PeerFlooderReceiveMessageQuotaExceeded, "PeerFlooderReceiveMessageQuotaExceeded" },
  133. { TraceCode.PeerServiceOpened, "PeerServiceOpened" },
  134. { TraceCode.PeerMaintainerActivity, "PeerMaintainerActivity" },
  135. { TraceCode.MsmqCannotPeekOnQueue, "MsmqCannotPeekOnQueue" },
  136. { TraceCode.MsmqCannotReadQueues, "MsmqCannotReadQueues" },
  137. { TraceCode.MsmqDatagramSent, "MsmqDatagramSent" },
  138. { TraceCode.MsmqDatagramReceived, "MsmqDatagramReceived" },
  139. { TraceCode.MsmqDetected, "MsmqDetected" },
  140. { TraceCode.MsmqEnteredBatch, "MsmqEnteredBatch" },
  141. { TraceCode.MsmqExpectedException, "MsmqExpectedException" },
  142. { TraceCode.MsmqFoundBaseAddress, "MsmqFoundBaseAddress" },
  143. { TraceCode.MsmqLeftBatch, "MsmqLeftBatch" },
  144. { TraceCode.MsmqMatchedApplicationFound, "MsmqMatchedApplicationFound" },
  145. { TraceCode.MsmqMessageDropped, "MsmqMessageDropped" },
  146. { TraceCode.MsmqMessageLockedUnderTheTransaction, "MsmqMessageLockedUnderTheTransaction" },
  147. { TraceCode.MsmqMessageRejected, "MsmqMessageRejected" },
  148. { TraceCode.MsmqMoveOrDeleteAttemptFailed, "MsmqMoveOrDeleteAttemptFailed" },
  149. { TraceCode.MsmqPoisonMessageMovedPoison, "MsmqPoisonMessageMovedPoison" },
  150. { TraceCode.MsmqPoisonMessageMovedRetry, "MsmqPoisonMessageMovedRetry" },
  151. { TraceCode.MsmqPoisonMessageRejected, "MsmqPoisonMessageRejected" },
  152. { TraceCode.MsmqPoolFull, "MsmqPoolFull" },
  153. { TraceCode.MsmqPotentiallyPoisonMessageDetected, "MsmqPotentiallyPoisonMessageDetected" },
  154. { TraceCode.MsmqQueueClosed, "MsmqQueueClosed" },
  155. { TraceCode.MsmqQueueOpened, "MsmqQueueOpened" },
  156. { TraceCode.MsmqQueueTransactionalStatusUnknown, "MsmqQueueTransactionalStatusUnknown" },
  157. { TraceCode.MsmqScanStarted, "MsmqScanStarted" },
  158. { TraceCode.MsmqSessiongramReceived, "MsmqSessiongramReceived" },
  159. { TraceCode.MsmqSessiongramSent, "MsmqSessiongramSent" },
  160. { TraceCode.MsmqStartingApplication, "MsmqStartingApplication" },
  161. { TraceCode.MsmqStartingService, "MsmqStartingService" },
  162. { TraceCode.MsmqUnexpectedAcknowledgment, "MsmqUnexpectedAcknowledgment" },
  163. { TraceCode.WsrmNegativeElapsedTimeDetected, "WsrmNegativeElapsedTimeDetected" },
  164. { TraceCode.TcpTransferError, "TcpTransferError" },
  165. { TraceCode.TcpConnectionResetError, "TcpConnectionResetError" },
  166. { TraceCode.TcpConnectionTimedOut, "TcpConnectionTimedOut" },
  167. // ComIntegration trace codes (TraceCode.ComIntegration)
  168. { TraceCode.ComIntegrationServiceHostStartingService, "ComIntegrationServiceHostStartingService" },
  169. { TraceCode.ComIntegrationServiceHostStartedService, "ComIntegrationServiceHostStartedService" },
  170. { TraceCode.ComIntegrationServiceHostCreatedServiceContract, "ComIntegrationServiceHostCreatedServiceContract" },
  171. { TraceCode.ComIntegrationServiceHostStartedServiceDetails, "ComIntegrationServiceHostStartedServiceDetails" },
  172. { TraceCode.ComIntegrationServiceHostCreatedServiceEndpoint, "ComIntegrationServiceHostCreatedServiceEndpoint" },
  173. { TraceCode.ComIntegrationServiceHostStoppingService, "ComIntegrationServiceHostStoppingService" },
  174. { TraceCode.ComIntegrationServiceHostStoppedService, "ComIntegrationServiceHostStoppedService" },
  175. { TraceCode.ComIntegrationDllHostInitializerStarting, "ComIntegrationDllHostInitializerStarting" },
  176. { TraceCode.ComIntegrationDllHostInitializerAddingHost, "ComIntegrationDllHostInitializerAddingHost" },
  177. { TraceCode.ComIntegrationDllHostInitializerStarted, "ComIntegrationDllHostInitializerStarted" },
  178. { TraceCode.ComIntegrationDllHostInitializerStopping, "ComIntegrationDllHostInitializerStopping" },
  179. { TraceCode.ComIntegrationDllHostInitializerStopped, "ComIntegrationDllHostInitializerStopped" },
  180. { TraceCode.ComIntegrationTLBImportStarting, "ComIntegrationTLBImportStarting" },
  181. { TraceCode.ComIntegrationTLBImportFromAssembly, "ComIntegrationTLBImportFromAssembly" },
  182. { TraceCode.ComIntegrationTLBImportFromTypelib, "ComIntegrationTLBImportFromTypelib" },
  183. { TraceCode.ComIntegrationTLBImportConverterEvent, "ComIntegrationTLBImportConverterEvent" },
  184. { TraceCode.ComIntegrationTLBImportFinished, "ComIntegrationTLBImportFinished" },
  185. { TraceCode.ComIntegrationInstanceCreationRequest, "ComIntegrationInstanceCreationRequest" },
  186. { TraceCode.ComIntegrationInstanceCreationSuccess, "ComIntegrationInstanceCreationSuccess" },
  187. { TraceCode.ComIntegrationInstanceReleased, "ComIntegrationInstanceReleased" },
  188. { TraceCode.ComIntegrationEnteringActivity, "ComIntegrationEnteringActivity" },
  189. { TraceCode.ComIntegrationExecutingCall, "ComIntegrationExecutingCall" },
  190. { TraceCode.ComIntegrationLeftActivity, "ComIntegrationLeftActivity" },
  191. { TraceCode.ComIntegrationInvokingMethod, "ComIntegrationInvokingMethod" },
  192. { TraceCode.ComIntegrationInvokedMethod, "ComIntegrationInvokedMethod" },
  193. { TraceCode.ComIntegrationInvokingMethodNewTransaction, "ComIntegrationInvokingMethodNewTransaction" },
  194. { TraceCode.ComIntegrationInvokingMethodContextTransaction, "ComIntegrationInvokingMethodContextTransaction" },
  195. { TraceCode.ComIntegrationServiceMonikerParsed, "ComIntegrationServiceMonikerParsed" },
  196. { TraceCode.ComIntegrationWsdlChannelBuilderLoaded, "ComIntegrationWsdlChannelBuilderLoaded" },
  197. { TraceCode.ComIntegrationTypedChannelBuilderLoaded, "ComIntegrationTypedChannelBuilderLoaded" },
  198. { TraceCode.ComIntegrationChannelCreated, "ComIntegrationChannelCreated" },
  199. { TraceCode.ComIntegrationDispatchMethod, "ComIntegrationDispatchMethod" },
  200. { TraceCode.ComIntegrationTxProxyTxCommitted, "ComIntegrationTxProxyTxCommitted" },
  201. { TraceCode.ComIntegrationTxProxyTxAbortedByContext, "ComIntegrationTxProxyTxAbortedByContext" },
  202. { TraceCode.ComIntegrationTxProxyTxAbortedByTM, "ComIntegrationTxProxyTxAbortedByTM" },
  203. { TraceCode.ComIntegrationMexMonikerMetadataExchangeComplete, "ComIntegrationMexMonikerMetadataExchangeComplete" },
  204. { TraceCode.ComIntegrationMexChannelBuilderLoaded, "ComIntegrationMexChannelBuilderLoaded" },
  205. // Security trace codes (TraceCode.Security)
  206. { TraceCode.Security, "Security" },
  207. { TraceCode.SecurityIdentityVerificationSuccess, "SecurityIdentityVerificationSuccess" },
  208. { TraceCode.SecurityIdentityVerificationFailure, "SecurityIdentityVerificationFailure" },
  209. { TraceCode.SecurityIdentityDeterminationSuccess, "SecurityIdentityDeterminationSuccess" },
  210. { TraceCode.SecurityIdentityDeterminationFailure, "SecurityIdentityDeterminationFailure" },
  211. { TraceCode.SecurityIdentityHostNameNormalizationFailure, "SecurityIdentityHostNameNormalizationFailure" },
  212. { TraceCode.SecurityImpersonationSuccess, "SecurityImpersonationSuccess" },
  213. { TraceCode.SecurityImpersonationFailure, "SecurityImpersonationFailure" },
  214. { TraceCode.SecurityNegotiationProcessingFailure, "SecurityNegotiationProcessingFailure" },
  215. { TraceCode.IssuanceTokenProviderRemovedCachedToken, "IssuanceTokenProviderRemovedCachedToken" },
  216. { TraceCode.IssuanceTokenProviderUsingCachedToken, "IssuanceTokenProviderUsingCachedToken" },
  217. { TraceCode.IssuanceTokenProviderBeginSecurityNegotiation, "IssuanceTokenProviderBeginSecurityNegotiation" },
  218. { TraceCode.IssuanceTokenProviderEndSecurityNegotiation, "IssuanceTokenProviderEndSecurityNegotiation" },
  219. { TraceCode.IssuanceTokenProviderRedirectApplied, "IssuanceTokenProviderRedirectApplied" },
  220. { TraceCode.IssuanceTokenProviderServiceTokenCacheFull, "IssuanceTokenProviderServiceTokenCacheFull" },
  221. { TraceCode.NegotiationTokenProviderAttached, "NegotiationTokenProviderAttached" },
  222. { TraceCode.SpnegoClientNegotiationCompleted, "SpnegoClientNegotiationCompleted" },
  223. { TraceCode.SpnegoServiceNegotiationCompleted, "SpnegoServiceNegotiationCompleted" },
  224. { TraceCode.SpnegoClientNegotiation, "SpnegoClientNegotiation" },
  225. { TraceCode.SpnegoServiceNegotiation, "SpnegoServiceNegotiation" },
  226. { TraceCode.NegotiationAuthenticatorAttached, "NegotiationAuthenticatorAttached" },
  227. { TraceCode.ServiceSecurityNegotiationCompleted, "ServiceSecurityNegotiationCompleted" },
  228. { TraceCode.SecurityContextTokenCacheFull, "SecurityContextTokenCacheFull" },
  229. { TraceCode.ExportSecurityChannelBindingEntry, "ExportSecurityChannelBindingEntry" },
  230. { TraceCode.ExportSecurityChannelBindingExit, "ExportSecurityChannelBindingExit" },
  231. { TraceCode.ImportSecurityChannelBindingEntry, "ImportSecurityChannelBindingEntry" },
  232. { TraceCode.ImportSecurityChannelBindingExit, "ImportSecurityChannelBindingExit" },
  233. { TraceCode.SecurityTokenProviderOpened, "SecurityTokenProviderOpened" },
  234. { TraceCode.SecurityTokenProviderClosed, "SecurityTokenProviderClosed" },
  235. { TraceCode.SecurityTokenAuthenticatorOpened, "SecurityTokenAuthenticatorOpened" },
  236. { TraceCode.SecurityTokenAuthenticatorClosed, "SecurityTokenAuthenticatorClosed" },
  237. { TraceCode.SecurityBindingOutgoingMessageSecured, "SecurityBindingOutgoingMessageSecured" },
  238. { TraceCode.SecurityBindingIncomingMessageVerified, "SecurityBindingIncomingMessageVerified" },
  239. { TraceCode.SecurityBindingSecureOutgoingMessageFailure, "SecurityBindingSecureOutgoingMessageFailure" },
  240. { TraceCode.SecurityBindingVerifyIncomingMessageFailure, "SecurityBindingVerifyIncomingMessageFailure" },
  241. { TraceCode.SecuritySpnToSidMappingFailure, "SecuritySpnToSidMappingFailure" },
  242. { TraceCode.SecuritySessionRedirectApplied, "SecuritySessionRedirectApplied" },
  243. { TraceCode.SecurityClientSessionCloseSent, "SecurityClientSessionCloseSent" },
  244. { TraceCode.SecurityClientSessionCloseResponseSent, "SecurityClientSessionCloseResponseSent" },
  245. { TraceCode.SecurityClientSessionCloseMessageReceived, "SecurityClientSessionCloseMessageReceived" },
  246. { TraceCode.SecuritySessionKeyRenewalFaultReceived, "SecuritySessionKeyRenewalFaultReceived" },
  247. { TraceCode.SecuritySessionAbortedFaultReceived, "SecuritySessionAbortedFaultReceived" },
  248. { TraceCode.SecuritySessionClosedResponseReceived, "SecuritySessionClosedResponseReceived" },
  249. { TraceCode.SecurityClientSessionPreviousKeyDiscarded, "SecurityClientSessionPreviousKeyDiscarded" },
  250. { TraceCode.SecurityClientSessionKeyRenewed, "SecurityClientSessionKeyRenewed" },
  251. { TraceCode.SecurityPendingServerSessionAdded, "SecurityPendingServerSessionAdded" },
  252. { TraceCode.SecurityPendingServerSessionClosed, "SecurityPendingServerSessionClosed" },
  253. { TraceCode.SecurityPendingServerSessionActivated, "SecurityPendingServerSessionActivated" },
  254. { TraceCode.SecurityActiveServerSessionRemoved, "SecurityActiveServerSessionRemoved" },
  255. { TraceCode.SecurityNewServerSessionKeyIssued, "SecurityNewServerSessionKeyIssued" },
  256. { TraceCode.SecurityInactiveSessionFaulted, "SecurityInactiveSessionFaulted" },
  257. { TraceCode.SecurityServerSessionKeyUpdated, "SecurityServerSessionKeyUpdated" },
  258. { TraceCode.SecurityServerSessionCloseReceived, "SecurityServerSessionCloseReceived" },
  259. { TraceCode.SecurityServerSessionRenewalFaultSent, "SecurityServerSessionRenewalFaultSent" },
  260. { TraceCode.SecurityServerSessionAbortedFaultSent, "SecurityServerSessionAbortedFaultSent" },
  261. { TraceCode.SecuritySessionCloseResponseSent, "SecuritySessionCloseResponseSent" },
  262. { TraceCode.SecuritySessionServerCloseSent, "SecuritySessionServerCloseSent" },
  263. { TraceCode.SecurityServerSessionCloseResponseReceived, "SecurityServerSessionCloseResponseReceived" },
  264. { TraceCode.SecuritySessionRenewFaultSendFailure, "SecuritySessionRenewFaultSendFailure" },
  265. { TraceCode.SecuritySessionAbortedFaultSendFailure, "SecuritySessionAbortedFaultSendFailure" },
  266. { TraceCode.SecuritySessionClosedResponseSendFailure, "SecuritySessionClosedResponseSendFailure" },
  267. { TraceCode.SecuritySessionServerCloseSendFailure, "SecuritySessionServerCloseSendFailure" },
  268. { TraceCode.SecuritySessionRequestorStartOperation, "SecuritySessionRequestorStartOperation" },
  269. { TraceCode.SecuritySessionRequestorOperationSuccess, "SecuritySessionRequestorOperationSuccess" },
  270. { TraceCode.SecuritySessionRequestorOperationFailure, "SecuritySessionRequestorOperationFailure" },
  271. { TraceCode.SecuritySessionResponderOperationFailure, "SecuritySessionResponderOperationFailure" },
  272. { TraceCode.SecuritySessionDemuxFailure, "SecuritySessionDemuxFailure" },
  273. { TraceCode.SecurityAuditWrittenSuccess, "SecurityAuditWrittenSuccess" },
  274. { TraceCode.SecurityAuditWrittenFailure, "SecurityAuditWrittenFailure" },
  275. // ServiceModel trace codes (TraceCode.ServiceModel)
  276. { TraceCode.AsyncCallbackThrewException, "AsyncCallbackThrewException" },
  277. { TraceCode.CommunicationObjectAborted, "CommunicationObjectAborted" },
  278. { TraceCode.CommunicationObjectAbortFailed, "CommunicationObjectAbortFailed" },
  279. { TraceCode.CommunicationObjectCloseFailed, "CommunicationObjectCloseFailed" },
  280. { TraceCode.CommunicationObjectOpenFailed, "CommunicationObjectOpenFailed" },
  281. { TraceCode.CommunicationObjectClosing, "CommunicationObjectClosing" },
  282. { TraceCode.CommunicationObjectClosed, "CommunicationObjectClosed" },
  283. { TraceCode.CommunicationObjectCreated, "CommunicationObjectCreated" },
  284. { TraceCode.CommunicationObjectDisposing, "CommunicationObjectDisposing" },
  285. { TraceCode.CommunicationObjectFaultReason, "CommunicationObjectFaultReason" },
  286. { TraceCode.CommunicationObjectFaulted, "CommunicationObjectFaulted" },
  287. { TraceCode.CommunicationObjectOpening, "CommunicationObjectOpening" },
  288. { TraceCode.CommunicationObjectOpened, "CommunicationObjectOpened" },
  289. { TraceCode.DidNotUnderstandMessageHeader, "DidNotUnderstandMessageHeader" },
  290. { TraceCode.UnderstoodMessageHeader, "UnderstoodMessageHeader" },
  291. { TraceCode.MessageClosed, "MessageClosed" },
  292. { TraceCode.MessageClosedAgain, "MessageClosedAgain" },
  293. { TraceCode.MessageCopied, "MessageCopied" },
  294. { TraceCode.MessageRead, "MessageRead" },
  295. { TraceCode.MessageWritten, "MessageWritten" },
  296. { TraceCode.BeginExecuteMethod, "BeginExecuteMethod" },
  297. { TraceCode.ConfigurationIsReadOnly, "ConfigurationIsReadOnly" },
  298. { TraceCode.ConfiguredExtensionTypeNotFound, "ConfiguredExtensionTypeNotFound" },
  299. { TraceCode.EvaluationContextNotFound, "EvaluationContextNotFound" },
  300. { TraceCode.EndExecuteMethod, "EndExecuteMethod" },
  301. { TraceCode.ExtensionCollectionDoesNotExist, "ExtensionCollectionDoesNotExist" },
  302. { TraceCode.ExtensionCollectionNameNotFound, "ExtensionCollectionNameNotFound" },
  303. { TraceCode.ExtensionCollectionIsEmpty, "ExtensionCollectionIsEmpty" },
  304. { TraceCode.ExtensionElementAlreadyExistsInCollection, "ExtensionElementAlreadyExistsInCollection" },
  305. { TraceCode.ElementTypeDoesntMatchConfiguredType, "ElementTypeDoesntMatchConfiguredType" },
  306. { TraceCode.ErrorInvokingUserCode, "ErrorInvokingUserCode" },
  307. { TraceCode.GetBehaviorElement, "GetBehaviorElement" },
  308. { TraceCode.GetCommonBehaviors, "GetCommonBehaviors" },
  309. { TraceCode.GetConfiguredBinding, "GetConfiguredBinding" },
  310. { TraceCode.GetChannelEndpointElement, "GetChannelEndpointElement" },
  311. { TraceCode.GetConfigurationSection, "GetConfigurationSection" },
  312. { TraceCode.GetDefaultConfiguredBinding, "GetDefaultConfiguredBinding" },
  313. { TraceCode.GetServiceElement, "GetServiceElement" },
  314. { TraceCode.MessageProcessingPaused, "MessageProcessingPaused" },
  315. { TraceCode.ManualFlowThrottleLimitReached, "ManualFlowThrottleLimitReached" },
  316. { TraceCode.OverridingDuplicateConfigurationKey, "OverridingDuplicateConfigurationKey" },
  317. { TraceCode.RemoveBehavior, "RemoveBehavior" },
  318. { TraceCode.ServiceChannelLifetime, "ServiceChannelLifetime" },
  319. { TraceCode.ServiceHostCreation, "ServiceHostCreation" },
  320. { TraceCode.ServiceHostBaseAddresses, "ServiceHostBaseAddresses" },
  321. { TraceCode.ServiceHostTimeoutOnClose, "ServiceHostTimeoutOnClose" },
  322. { TraceCode.ServiceHostFaulted, "ServiceHostFaulted" },
  323. { TraceCode.ServiceHostErrorOnReleasePerformanceCounter, "ServiceHostErrorOnReleasePerformanceCounter" },
  324. { TraceCode.ServiceThrottleLimitReached, "ServiceThrottleLimitReached" },
  325. { TraceCode.ServiceOperationMissingReply, "ServiceOperationMissingReply" },
  326. { TraceCode.ServiceOperationMissingReplyContext, "ServiceOperationMissingReplyContext" },
  327. { TraceCode.ServiceOperationExceptionOnReply, "ServiceOperationExceptionOnReply" },
  328. { TraceCode.SkipBehavior, "SkipBehavior" },
  329. { TraceCode.TransportListen, "TransportListen" },
  330. { TraceCode.UnhandledAction, "UnhandledAction" },
  331. { TraceCode.PerformanceCounterFailedToLoad, "PerformanceCounterFailedToLoad" },
  332. { TraceCode.PerformanceCountersFailed, "PerformanceCountersFailed" },
  333. { TraceCode.PerformanceCountersFailedDuringUpdate, "PerformanceCountersFailedDuringUpdate" },
  334. { TraceCode.PerformanceCountersFailedForService, "PerformanceCountersFailedForService" },
  335. { TraceCode.PerformanceCountersFailedOnRelease, "PerformanceCountersFailedOnRelease" },
  336. { TraceCode.WsmexNonCriticalWsdlExportError, "WsmexNonCriticalWsdlExportError" },
  337. { TraceCode.WsmexNonCriticalWsdlImportError, "WsmexNonCriticalWsdlImportError" },
  338. { TraceCode.FailedToOpenIncomingChannel, "FailedToOpenIncomingChannel" },
  339. { TraceCode.UnhandledExceptionInUserOperation, "UnhandledExceptionInUserOperation" },
  340. { TraceCode.DroppedAMessage, "DroppedAMessage" },
  341. { TraceCode.CannotBeImportedInCurrentFormat, "CannotBeImportedInCurrentFormat" },
  342. { TraceCode.GetConfiguredEndpoint, "GetConfiguredEndpoint" },
  343. { TraceCode.GetDefaultConfiguredEndpoint, "GetDefaultConfiguredEndpoint" },
  344. { TraceCode.ExtensionTypeNotFound, "ExtensionTypeNotFound" },
  345. { TraceCode.DefaultEndpointsAdded, "DefaultEndpointsAdded" },
  346. //ServiceModel Metadata codes
  347. { TraceCode.MetadataExchangeClientSendRequest, "MetadataExchangeClientSendRequest" },
  348. { TraceCode.MetadataExchangeClientReceiveReply, "MetadataExchangeClientReceiveReply" },
  349. { TraceCode.WarnHelpPageEnabledNoBaseAddress, "WarnHelpPageEnabledNoBaseAddress" },
  350. // PortSharingtrace codes (TraceCode.PortSharing)
  351. { TraceCode.PortSharingClosed, "PortSharingClosed" },
  352. { TraceCode.PortSharingDuplicatedPipe, "PortSharingDuplicatedPipe" },
  353. { TraceCode.PortSharingDupHandleGranted, "PortSharingDupHandleGranted" },
  354. { TraceCode.PortSharingDuplicatedSocket, "PortSharingDuplicatedSocket" },
  355. { TraceCode.PortSharingListening, "PortSharingListening" },
  356. { TraceCode.SharedManagerServiceEndpointNotExist, "SharedManagerServiceEndpointNotExist" },
  357. //Indigo Tx trace codes (TraceCode.ServiceModelTransaction)
  358. { TraceCode.TxSourceTxScopeRequiredIsTransactedTransport, "TxSourceTxScopeRequiredIsTransactedTransport" },
  359. { TraceCode.TxSourceTxScopeRequiredIsTransactionFlow, "TxSourceTxScopeRequiredIsTransactionFlow" },
  360. { TraceCode.TxSourceTxScopeRequiredIsAttachedTransaction, "TxSourceTxScopeRequiredIsAttachedTransaction" },
  361. { TraceCode.TxSourceTxScopeRequiredIsCreateNewTransaction, "TxSourceTxScopeRequiredIsCreateNewTransaction" },
  362. { TraceCode.TxCompletionStatusCompletedForAutocomplete, "TxCompletionStatusCompletedForAutocomplete" },
  363. { TraceCode.TxCompletionStatusCompletedForError, "TxCompletionStatusCompletedForError" },
  364. { TraceCode.TxCompletionStatusCompletedForSetComplete, "TxCompletionStatusCompletedForSetComplete" },
  365. { TraceCode.TxCompletionStatusCompletedForTACOSC, "TxCompletionStatusCompletedForTACOSC" },
  366. { TraceCode.TxCompletionStatusCompletedForAsyncAbort, "TxCompletionStatusCompletedForAsyncAbort" },
  367. { TraceCode.TxCompletionStatusRemainsAttached, "TxCompletionStatusRemainsAttached" },
  368. { TraceCode.TxCompletionStatusAbortedOnSessionClose, "TxCompletionStatusAbortedOnSessionClose" },
  369. { TraceCode.TxReleaseServiceInstanceOnCompletion, "TxReleaseServiceInstanceOnCompletion" },
  370. { TraceCode.TxAsyncAbort, "TxAsyncAbort" },
  371. { TraceCode.TxFailedToNegotiateOleTx, "TxFailedToNegotiateOleTx" },
  372. { TraceCode.TxSourceTxScopeRequiredUsingExistingTransaction, "TxSourceTxScopeRequiredUsingExistingTransaction" },
  373. //CfxGreen trace codes (TraceCode.NetFx35)
  374. { TraceCode.ActivatingMessageReceived, "ActivatingMessageReceived" },
  375. { TraceCode.InstanceContextBoundToDurableInstance, "InstanceContextBoundToDurableInstance" },
  376. { TraceCode.InstanceContextDetachedFromDurableInstance, "InstanceContextDetachedFromDurableInstance" },
  377. { TraceCode.ContextChannelFactoryChannelCreated, "ContextChannelFactoryChannelCreated" },
  378. { TraceCode.ContextChannelListenerChannelAccepted, "ContextChannelListenerChannelAccepted" },
  379. { TraceCode.ContextProtocolContextAddedToMessage, "ContextProtocolContextAddedToMessage" },
  380. { TraceCode.ContextProtocolContextRetrievedFromMessage, "ContextProtocolContextRetrievedFromMessage" },
  381. { TraceCode.DICPInstanceContextCached, "DICPInstanceContextCached" },
  382. { TraceCode.DICPInstanceContextRemovedFromCache, "DICPInstanceContextRemovedFromCache" },
  383. { TraceCode.ServiceDurableInstanceDeleted, "ServiceDurableInstanceDeleted" },
  384. { TraceCode.ServiceDurableInstanceDisposed, "ServiceDurableInstanceDisposed" },
  385. { TraceCode.ServiceDurableInstanceLoaded, "ServiceDurableInstanceLoaded" },
  386. { TraceCode.ServiceDurableInstanceSaved, "ServiceDurableInstanceSaved" },
  387. { TraceCode.SqlPersistenceProviderSQLCallStart, "SqlPersistenceProviderSQLCallStart" },
  388. { TraceCode.SqlPersistenceProviderSQLCallEnd, "SqlPersistenceProviderSQLCallEnd" },
  389. { TraceCode.SqlPersistenceProviderOpenParameters, "SqlPersistenceProviderOpenParameters" },
  390. { TraceCode.SyncContextSchedulerServiceTimerCancelled, "SyncContextSchedulerServiceTimerCancelled" },
  391. { TraceCode.SyncContextSchedulerServiceTimerCreated, "SyncContextSchedulerServiceTimerCreated" },
  392. { TraceCode.WorkflowDurableInstanceLoaded, "WorkflowDurableInstanceLoaded" },
  393. { TraceCode.WorkflowDurableInstanceAborted, "WorkflowDurableInstanceAborted" },
  394. { TraceCode.WorkflowDurableInstanceActivated, "WorkflowDurableInstanceActivated" },
  395. { TraceCode.WorkflowOperationInvokerItemQueued, "WorkflowOperationInvokerItemQueued" },
  396. { TraceCode.WorkflowRequestContextReplySent, "WorkflowRequestContextReplySent" },
  397. { TraceCode.WorkflowRequestContextFaultSent, "WorkflowRequestContextFaultSent" },
  398. { TraceCode.WorkflowServiceHostCreated, "WorkflowServiceHostCreated" },
  399. { TraceCode.SyndicationReadFeedBegin, "SyndicationReadFeedBegin" },
  400. { TraceCode.SyndicationReadFeedEnd, "SyndicationReadFeedEnd" },
  401. { TraceCode.SyndicationReadItemBegin, "SyndicationReadItemBegin" },
  402. { TraceCode.SyndicationReadItemEnd, "SyndicationReadItemEnd" },
  403. { TraceCode.SyndicationWriteFeedBegin, "SyndicationWriteFeedBegin" },
  404. { TraceCode.SyndicationWriteFeedEnd, "SyndicationWriteFeedEnd" },
  405. { TraceCode.SyndicationWriteItemBegin, "SyndicationWriteItemBegin" },
  406. { TraceCode.SyndicationWriteItemEnd, "SyndicationWriteItemEnd" },
  407. { TraceCode.SyndicationProtocolElementIgnoredOnRead, "SyndicationProtocolElementIgnoredOnRead" },
  408. { TraceCode.SyndicationProtocolElementIgnoredOnWrite, "SyndicationProtocolElementIgnoredOnWrite" },
  409. { TraceCode.SyndicationProtocolElementInvalid, "SyndicationProtocolElementInvalid" },
  410. { TraceCode.WebUnknownQueryParameterIgnored, "WebUnknownQueryParameterIgnored" },
  411. { TraceCode.WebRequestMatchesOperation, "WebRequestMatchesOperation" },
  412. { TraceCode.WebRequestDoesNotMatchOperations, "WebRequestDoesNotMatchOperations" },
  413. { TraceCode.WebRequestRedirect, "WebRequestRedirect" },
  414. { TraceCode.SyndicationReadServiceDocumentBegin, "SyndicationReadServiceDocumentBegin" },
  415. { TraceCode.SyndicationReadServiceDocumentEnd, "SyndicationReadServiceDocumentEnd" },
  416. { TraceCode.SyndicationReadCategoriesDocumentBegin, "SyndicationReadCategoriesDocumentBegin" },
  417. { TraceCode.SyndicationReadCategoriesDocumentEnd, "SyndicationReadCategoriesDocumentEnd" },
  418. { TraceCode.SyndicationWriteServiceDocumentBegin, "SyndicationWriteServiceDocumentBegin" },
  419. { TraceCode.SyndicationWriteServiceDocumentEnd, "SyndicationWriteServiceDocumentEnd" },
  420. { TraceCode.SyndicationWriteCategoriesDocumentBegin, "SyndicationWriteCategoriesDocumentBegin" },
  421. { TraceCode.SyndicationWriteCategoriesDocumentEnd, "SyndicationWriteCategoriesDocumentEnd" },
  422. { TraceCode.AutomaticFormatSelectedOperationDefault, "AutomaticFormatSelectedOperationDefault" },
  423. { TraceCode.AutomaticFormatSelectedRequestBased, "AutomaticFormatSelectedRequestBased" },
  424. { TraceCode.RequestFormatSelectedFromContentTypeMapper, "RequestFormatSelectedFromContentTypeMapper" },
  425. { TraceCode.RequestFormatSelectedByEncoderDefaults, "RequestFormatSelectedByEncoderDefaults" },
  426. { TraceCode.AddingResponseToOutputCache, "AddingResponseToOutputCache" },
  427. { TraceCode.AddingAuthenticatedResponseToOutputCache, "AddingAuthenticatedResponseToOutputCache" },
  428. { TraceCode.JsonpCallbackNameSet, "JsonpCallbackNameSet" },
  429. };
  430. public const string E2EActivityId = "E2EActivityId";
  431. public const string TraceApplicationReference = "TraceApplicationReference";
  432. public static InputQueue<T> CreateInputQueue<T>() where T : class
  433. {
  434. if (asyncCallbackGenerator == null)
  435. {
  436. asyncCallbackGenerator = new Func<Action<AsyncCallback, IAsyncResult>>(CallbackGenerator);
  437. }
  438. return new InputQueue<T>(asyncCallbackGenerator)
  439. {
  440. DisposeItemCallback = value =>
  441. {
  442. if (value is ICommunicationObject)
  443. {
  444. ((ICommunicationObject)value).Abort();
  445. }
  446. }
  447. };
  448. }
  449. static Action<AsyncCallback, IAsyncResult> CallbackGenerator()
  450. {
  451. if (DiagnosticUtility.ShouldUseActivity)
  452. {
  453. ServiceModelActivity callbackActivity = ServiceModelActivity.Current;
  454. if (callbackActivity != null)
  455. {
  456. return delegate(AsyncCallback callback, IAsyncResult result)
  457. {
  458. using (ServiceModelActivity.BoundOperation(callbackActivity))
  459. {
  460. callback(result);
  461. }
  462. };
  463. }
  464. }
  465. return null;
  466. }
  467. static internal void AddActivityHeader(Message message)
  468. {
  469. try
  470. {
  471. ActivityIdHeader activityIdHeader = new ActivityIdHeader(TraceUtility.ExtractActivityId(message));
  472. activityIdHeader.AddTo(message);
  473. }
  474. #pragma warning suppress 56500 // covered by FxCOP
  475. catch (Exception e)
  476. {
  477. if (Fx.IsFatal(e))
  478. {
  479. throw;
  480. }
  481. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
  482. SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
  483. }
  484. }
  485. static internal void AddAmbientActivityToMessage(Message message)
  486. {
  487. try
  488. {
  489. ActivityIdHeader activityIdHeader = new ActivityIdHeader(DiagnosticTraceBase.ActivityId);
  490. activityIdHeader.AddTo(message);
  491. }
  492. #pragma warning suppress 56500 // covered by FxCOP
  493. catch (Exception e)
  494. {
  495. if (Fx.IsFatal(e))
  496. {
  497. throw;
  498. }
  499. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
  500. SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
  501. }
  502. }
  503. static internal void CopyActivity(Message source, Message destination)
  504. {
  505. if (DiagnosticUtility.ShouldUseActivity)
  506. {
  507. TraceUtility.SetActivity(destination, TraceUtility.ExtractActivity(source));
  508. }
  509. }
  510. internal static long GetUtcBasedDurationForTrace(long startTicks)
  511. {
  512. if (startTicks > 0)
  513. {
  514. TimeSpan elapsedTime = new TimeSpan(DateTime.UtcNow.Ticks - startTicks);
  515. return (long)elapsedTime.TotalMilliseconds;
  516. }
  517. return 0;
  518. }
  519. internal static ServiceModelActivity ExtractActivity(Message message)
  520. {
  521. ServiceModelActivity retval = null;
  522. if ((DiagnosticUtility.ShouldUseActivity || TraceUtility.ShouldPropagateActivityGlobal) &&
  523. (message != null) &&
  524. (message.State != MessageState.Closed))
  525. {
  526. object property;
  527. if (message.Properties.TryGetValue(TraceUtility.ActivityIdKey, out property))
  528. {
  529. retval = property as ServiceModelActivity;
  530. }
  531. }
  532. return retval;
  533. }
  534. internal static Guid ExtractActivityId(Message message)
  535. {
  536. if (TraceUtility.MessageFlowTracingOnly)
  537. {
  538. return ActivityIdHeader.ExtractActivityId(message);
  539. }
  540. ServiceModelActivity activity = ExtractActivity(message);
  541. return activity == null ? Guid.Empty : activity.Id;
  542. }
  543. internal static Guid GetReceivedActivityId(OperationContext operationContext)
  544. {
  545. object activityIdFromProprties;
  546. if (!operationContext.IncomingMessageProperties.TryGetValue(E2EActivityId, out activityIdFromProprties))
  547. {
  548. return TraceUtility.ExtractActivityId(operationContext.IncomingMessage);
  549. }
  550. else
  551. {
  552. return (Guid)activityIdFromProprties;
  553. }
  554. }
  555. internal static ServiceModelActivity ExtractAndRemoveActivity(Message message)
  556. {
  557. ServiceModelActivity retval = TraceUtility.ExtractActivity(message);
  558. if (retval != null)
  559. {
  560. // If the property is just removed, the item is disposed and we don't want the thing
  561. // to be disposed of.
  562. message.Properties[TraceUtility.ActivityIdKey] = false;
  563. }
  564. return retval;
  565. }
  566. internal static void ProcessIncomingMessage(Message message, EventTraceActivity eventTraceActivity)
  567. {
  568. ServiceModelActivity activity = ServiceModelActivity.Current;
  569. if (activity != null && DiagnosticUtility.ShouldUseActivity)
  570. {
  571. ServiceModelActivity incomingActivity = TraceUtility.ExtractActivity(message);
  572. if (null != incomingActivity && incomingActivity.Id != activity.Id)
  573. {
  574. using (ServiceModelActivity.BoundOperation(incomingActivity))
  575. {
  576. if (null != FxTrace.Trace)
  577. {
  578. FxTrace.Trace.TraceTransfer(activity.Id);
  579. }
  580. }
  581. }
  582. TraceUtility.SetActivity(message, activity);
  583. }
  584. TraceUtility.MessageFlowAtMessageReceived(message, null, eventTraceActivity, true);
  585. if (MessageLogger.LogMessagesAtServiceLevel)
  586. {
  587. MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelReceiveReply | MessageLoggingSource.LastChance);
  588. }
  589. }
  590. internal static void ProcessOutgoingMessage(Message message, EventTraceActivity eventTraceActivity)
  591. {
  592. ServiceModelActivity activity = ServiceModelActivity.Current;
  593. if (DiagnosticUtility.ShouldUseActivity)
  594. {
  595. TraceUtility.SetActivity(message, activity);
  596. }
  597. if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity)
  598. {
  599. TraceUtility.AddAmbientActivityToMessage(message);
  600. }
  601. TraceUtility.MessageFlowAtMessageSent(message, eventTraceActivity);
  602. if (MessageLogger.LogMessagesAtServiceLevel)
  603. {
  604. MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelSendRequest | MessageLoggingSource.LastChance);
  605. }
  606. }
  607. internal static void SetActivity(Message message, ServiceModelActivity activity)
  608. {
  609. if (DiagnosticUtility.ShouldUseActivity && message != null && message.State != MessageState.Closed)
  610. {
  611. message.Properties[TraceUtility.ActivityIdKey] = activity;
  612. }
  613. }
  614. internal static void TraceDroppedMessage(Message message, EndpointDispatcher dispatcher)
  615. {
  616. if (DiagnosticUtility.ShouldTraceInformation)
  617. {
  618. EndpointAddress endpointAddress = null;
  619. if (dispatcher != null)
  620. {
  621. endpointAddress = dispatcher.EndpointAddress;
  622. }
  623. TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.DroppedAMessage,
  624. SR.GetString(SR.TraceCodeDroppedAMessage), new MessageDroppedTraceRecord(message, endpointAddress));
  625. }
  626. }
  627. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription)
  628. {
  629. TraceEvent(severity, traceCode, traceDescription, null, traceDescription, (Exception)null);
  630. }
  631. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData)
  632. {
  633. TraceEvent(severity, traceCode, traceDescription, extendedData, null, (Exception)null);
  634. }
  635. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source)
  636. {
  637. TraceEvent(severity, traceCode, traceDescription, null, source, (Exception)null);
  638. }
  639. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Exception exception)
  640. {
  641. TraceEvent(severity, traceCode, traceDescription, null, source, exception);
  642. }
  643. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Message message)
  644. {
  645. if (message == null)
  646. {
  647. TraceEvent(severity, traceCode, traceDescription, null, (Exception)null);
  648. }
  649. else
  650. {
  651. TraceEvent(severity, traceCode, traceDescription, message, message);
  652. }
  653. }
  654. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Message message)
  655. {
  656. Guid activityId = TraceUtility.ExtractActivityId(message);
  657. if (DiagnosticUtility.ShouldTrace(severity))
  658. {
  659. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), null, activityId, message);
  660. }
  661. }
  662. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Exception exception, Message message)
  663. {
  664. Guid activityId = TraceUtility.ExtractActivityId(message);
  665. if (DiagnosticUtility.ShouldTrace(severity))
  666. {
  667. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), exception, activityId, null);
  668. }
  669. }
  670. internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
  671. {
  672. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
  673. }
  674. // These methods require a TraceRecord to be allocated, so we want them to show up on profiles if the caller didn't avoid
  675. // allocating the TraceRecord by using ShouldTrace.
  676. [MethodImpl(MethodImplOptions.NoInlining)]
  677. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
  678. {
  679. if (DiagnosticUtility.ShouldTrace(severity))
  680. {
  681. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
  682. }
  683. }
  684. [MethodImpl(MethodImplOptions.NoInlining)]
  685. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Message message)
  686. {
  687. Guid activityId = TraceUtility.ExtractActivityId(message);
  688. if (DiagnosticUtility.ShouldTrace(severity))
  689. {
  690. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
  691. traceDescription, extendedData, exception, activityId, source);
  692. }
  693. }
  694. internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
  695. {
  696. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
  697. traceDescription, extendedData, exception, activityId, source);
  698. }
  699. [MethodImpl(MethodImplOptions.NoInlining)]
  700. internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
  701. {
  702. if (DiagnosticUtility.ShouldTrace(severity))
  703. {
  704. DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
  705. traceDescription, extendedData, exception, activityId, source);
  706. }
  707. }
  708. static string GenerateMsdnTraceCode(int traceCode)
  709. {
  710. int group = (int)(traceCode & 0xFFFF0000);
  711. string terminatorUri = null;
  712. switch (group)
  713. {
  714. case TraceCode.Administration:
  715. terminatorUri = "System.ServiceModel.Administration";
  716. break;
  717. case TraceCode.Channels:
  718. terminatorUri = "System.ServiceModel.Channels";
  719. break;
  720. case TraceCode.ComIntegration:
  721. terminatorUri = "System.ServiceModel.ComIntegration";
  722. break;
  723. case TraceCode.Diagnostics:
  724. terminatorUri = "System.ServiceModel.Diagnostics";
  725. break;
  726. case TraceCode.PortSharing:
  727. terminatorUri = "System.ServiceModel.PortSharing";
  728. break;
  729. case TraceCode.Security:
  730. terminatorUri = "System.ServiceModel.Security";
  731. break;
  732. case TraceCode.Serialization:
  733. terminatorUri = "System.Runtime.Serialization";
  734. break;
  735. case TraceCode.ServiceModel:
  736. case TraceCode.ServiceModelTransaction:
  737. terminatorUri = "System.ServiceModel";
  738. break;
  739. default:
  740. terminatorUri = string.Empty;
  741. break;
  742. }
  743. Fx.Assert(traceCodes.ContainsKey(traceCode),
  744. string.Format(CultureInfo.InvariantCulture, "Unsupported trace code: Please add trace code 0x{0} to the SortedList TraceUtility.traceCodes in {1}",
  745. traceCode.ToString("X", CultureInfo.InvariantCulture), typeof(TraceUtility)));
  746. #if !MONO
  747. return LegacyDiagnosticTrace.GenerateMsdnTraceCode(terminatorUri, traceCodes[traceCode]);
  748. #else
  749. return "";
  750. #endif
  751. }
  752. internal static Exception ThrowHelperError(Exception exception, Message message)
  753. {
  754. // If the message is closed, we won't get an activity
  755. Guid activityId = TraceUtility.ExtractActivityId(message);
  756. if (DiagnosticUtility.ShouldTraceError)
  757. {
  758. DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
  759. TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
  760. }
  761. return exception;
  762. }
  763. internal static Exception ThrowHelperError(Exception exception, Guid activityId, object source)
  764. {
  765. if (DiagnosticUtility.ShouldTraceError)
  766. {
  767. DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
  768. TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, source);
  769. }
  770. return exception;
  771. }
  772. internal static Exception ThrowHelperWarning(Exception exception, Message message)
  773. {
  774. if (DiagnosticUtility.ShouldTraceWarning)
  775. {
  776. Guid activityId = TraceUtility.ExtractActivityId(message);
  777. DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
  778. TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
  779. }
  780. return exception;
  781. }
  782. internal static ArgumentException ThrowHelperArgument(string paramName, string message, Message msg)
  783. {
  784. return (ArgumentException)TraceUtility.ThrowHelperError(new ArgumentException(message, paramName), msg);
  785. }
  786. internal static ArgumentNullException ThrowHelperArgumentNull(string paramName, Message message)
  787. {
  788. return (ArgumentNullException)TraceUtility.ThrowHelperError(new ArgumentNullException(paramName), message);
  789. }
  790. internal static string CreateSourceString(object source)
  791. {
  792. return source.GetType().ToString() + "/" + source.GetHashCode().ToString(CultureInfo.CurrentCulture);
  793. }
  794. internal static void TraceHttpConnectionInformation(string localEndpoint, string remoteEndpoint, object source)
  795. {
  796. if (DiagnosticUtility.ShouldTraceInformation)
  797. {
  798. Dictionary<string, string> values = new Dictionary<string, string>(2)
  799. {
  800. { "LocalEndpoint", localEndpoint },
  801. { "RemoteEndpoint", remoteEndpoint }
  802. };
  803. TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.ConnectToIPEndpoint,
  804. SR.GetString(SR.TraceCodeConnectToIPEndpoint), new DictionaryTraceRecord(values), source, null);
  805. }
  806. }
  807. internal static void TraceUserCodeException(Exception e, MethodInfo method)
  808. {
  809. if (DiagnosticUtility.ShouldTraceWarning)
  810. {
  811. StringTraceRecord record = new StringTraceRecord("Comment",
  812. SR.GetString(SR.SFxUserCodeThrewException, method.DeclaringType.FullName, method.Name));
  813. DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning,
  814. TraceCode.UnhandledExceptionInUserOperation, GenerateMsdnTraceCode(TraceCode.UnhandledExceptionInUserOperation),
  815. SR.GetString(SR.TraceCodeUnhandledExceptionInUserOperation, method.DeclaringType.FullName, method.Name),
  816. record,
  817. e, null);
  818. }
  819. }
  820. static TraceUtility()
  821. {
  822. //Maintain the order of calls
  823. TraceUtility.SetEtwProviderId();
  824. TraceUtility.SetEndToEndTracingFlags();
  825. if (DiagnosticUtility.DiagnosticTrace != null)
  826. {
  827. DiagnosticTraceSource ts = (DiagnosticTraceSource)DiagnosticUtility.DiagnosticTrace.TraceSource;
  828. TraceUtility.shouldPropagateActivity = (ts.PropagateActivity || TraceUtility.shouldPropagateActivityGlobal);
  829. }
  830. }
  831. [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
  832. Safe = "Doesn't leak config section instance, just reads and stores bool values.")]
  833. [SecuritySafeCritical]
  834. static void SetEndToEndTracingFlags()
  835. {
  836. EndToEndTracingElement element = DiagnosticSection.UnsafeGetSection().EndToEndTracing;
  837. TraceUtility.shouldPropagateActivityGlobal = element.PropagateActivity;
  838. // if Sys.Diag trace is not enabled then the value is true if shouldPropagateActivityGlobal is true
  839. TraceUtility.shouldPropagateActivity = TraceUtility.shouldPropagateActivityGlobal || TraceUtility.shouldPropagateActivity;
  840. //Activity tracing is enabled by either of the flags (Sys.Diag trace source or E2E config element)
  841. DiagnosticUtility.ShouldUseActivity = (DiagnosticUtility.ShouldUseActivity || element.ActivityTracing);
  842. TraceUtility.activityTracing = DiagnosticUtility.ShouldUseActivity;
  843. TraceUtility.messageFlowTracing = element.MessageFlowTracing || TraceUtility.activityTracing;
  844. TraceUtility.messageFlowTracingOnly = element.MessageFlowTracing && !element.ActivityTracing;
  845. //Set the flag if activity tracing is enabled through the E2E config element as well
  846. DiagnosticUtility.TracingEnabled = (DiagnosticUtility.TracingEnabled || TraceUtility.activityTracing);
  847. }
  848. static public long RetrieveMessageNumber()
  849. {
  850. return Interlocked.Increment(ref TraceUtility.messageNumber);
  851. }
  852. static public bool PropagateUserActivity
  853. {
  854. get
  855. {
  856. return TraceUtility.ShouldPropagateActivity &&
  857. TraceUtility.PropagateUserActivityCore;
  858. }
  859. }
  860. // Most of the time, shouldPropagateActivity will be false.
  861. // This property will rarely be executed as a result.
  862. static bool PropagateUserActivityCore
  863. {
  864. [MethodImpl(MethodImplOptions.NoInlining)]
  865. get
  866. {
  867. return !(DiagnosticUtility.TracingEnabled) &&
  868. DiagnosticTraceBase.ActivityId != Guid.Empty;
  869. }
  870. }
  871. static internal string GetCallerInfo(OperationContext context)
  872. {
  873. if (context != null && context.IncomingMessageProperties != null)
  874. {
  875. object endpointMessageProperty;
  876. if (context.IncomingMessageProperties.TryGetValue(RemoteEndpointMessageProperty.Name, out endpointMessageProperty))
  877. {
  878. RemoteEndpointMessageProperty endpoint = endpointMessageProperty as RemoteEndpointMessageProperty;
  879. if (endpoint != null)
  880. {
  881. return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", endpoint.Address, endpoint.Port);
  882. }
  883. }
  884. }
  885. return "null";
  886. }
  887. [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
  888. Safe = "Doesn't leak config section instance, just reads and stores string values for Guid")]
  889. [SecuritySafeCritical]
  890. static internal void SetEtwProviderId()
  891. {
  892. // Get section should not trace as the ETW provider id is not set yet
  893. DiagnosticSection diagnostics = DiagnosticSection.UnsafeGetSectionNoTrace();
  894. Guid etwProviderId = Guid.Empty;
  895. //set the Id in PT if specified in the config file. If not, ETW tracing is off.
  896. if (PartialTrustHelpers.HasEtwPermissions() || diagnostics.IsEtwProviderIdFromConfigFile())
  897. {
  898. etwProviderId = Fx.CreateGuid(diagnostics.EtwProviderId);
  899. }
  900. System.Runtime.Diagnostics.EtwDiagnosticTrace.DefaultEtwProviderId = etwProviderId;
  901. }
  902. static internal void SetActivityId(MessageProperties properties)
  903. {
  904. Guid activityId;
  905. if ((null != properties) && properties.TryGetValue(TraceUtility.E2EActivityId, out activityId))
  906. {
  907. DiagnosticTraceBase.ActivityId = activityId;
  908. }
  909. }
  910. static internal bool ShouldPropagateActivity
  911. {
  912. get { return TraceUtility.shouldPropagateActivity; }
  913. }
  914. static internal bool ShouldPropagateActivityGlobal
  915. {
  916. get { return TraceUtility.shouldPropagateActivityGlobal; }
  917. }
  918. static internal bool ActivityTracing
  919. {
  920. get { return TraceUtility.activityTracing; }
  921. }
  922. static internal bool MessageFlowTracing
  923. {
  924. get { return TraceUtility.messageFlowTracing; }
  925. }
  926. static internal bool MessageFlowTracingOnly
  927. {
  928. get { return TraceUtility.messageFlowTracingOnly; }
  929. }
  930. static internal void MessageFlowAtMessageSent(Message message, EventTraceActivity eventTraceActivity)
  931. {
  932. if (TraceUtility.MessageFlowTracing)
  933. {
  934. Guid activityId;
  935. Guid correlationId;
  936. bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
  937. if (TraceUtility.MessageFlowTracingOnly)
  938. {
  939. if (activityIdFound && activityId != DiagnosticTraceBase.ActivityId)
  940. {
  941. DiagnosticTraceBase.ActivityId = activityId;
  942. }
  943. }
  944. if (TD.MessageSentToTransportIsEnabled())
  945. {
  946. TD.MessageSentToTransport(eventTraceActivity, correlationId);
  947. }
  948. }
  949. }
  950. static internal void MessageFlowAtMessageReceived(Message message, OperationContext context, EventTraceActivity eventTraceActivity, bool createNewActivityId)
  951. {
  952. if (TraceUtility.MessageFlowTracing)
  953. {
  954. Guid activityId;
  955. Guid correlationId;
  956. bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
  957. if (TraceUtility.MessageFlowTracingOnly)
  958. {
  959. if (createNewActivityId)
  960. {
  961. if (!activityIdFound)
  962. {
  963. activityId = Guid.NewGuid();
  964. activityIdFound = true;
  965. }
  966. //message flow tracing only - start fresh
  967. DiagnosticTraceBase.ActivityId = Guid.Empty;
  968. }
  969. if (activityIdFound)
  970. {
  971. FxTrace.Trace.SetAndTraceTransfer(activityId, !createNewActivityId);
  972. message.Properties[TraceUtility.E2EActivityId] = Trace.CorrelationManager.ActivityId;
  973. }
  974. }
  975. if (TD.MessageReceivedFromTransportIsEnabled())
  976. {
  977. if (context == null)
  978. {
  979. context = OperationContext.Current;
  980. }
  981. TD.MessageReceivedFromTransport(eventTraceActivity, correlationId, TraceUtility.GetAnnotation(context));
  982. }
  983. }
  984. }
  985. internal static string GetAnnotation(OperationContext context)
  986. {
  987. object hostReference;
  988. if (context != null && null != context.IncomingMessage && (MessageState.Closed != context.IncomingMessage.State))
  989. {
  990. if (!context.IncomingMessageProperties.TryGetValue(TraceApplicationReference, out hostReference))
  991. {
  992. hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(context.Host);
  993. context.IncomingMessageProperties.Add(TraceApplicationReference, hostReference);
  994. }
  995. }
  996. else
  997. {
  998. hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(null);
  999. }
  1000. return (string)hostReference;
  1001. }
  1002. internal static void TransferFromTransport(Message message)
  1003. {
  1004. if (message != null && DiagnosticUtility.ShouldUseActivity)
  1005. {
  1006. Guid guid = Guid.Empty;
  1007. // Only look if we are allowing user propagation
  1008. if (TraceUtility.ShouldPropagateActivity)
  1009. {
  1010. guid = ActivityIdHeader.ExtractActivityId(message);
  1011. }
  1012. if (guid == Guid.Empty)
  1013. {
  1014. guid = Guid.NewGuid();
  1015. }
  1016. ServiceModelActivity activity = null;
  1017. bool emitStart = true;
  1018. if (ServiceModelActivity.Current != null)
  1019. {
  1020. if ((ServiceModelActivity.Current.Id == guid) ||
  1021. (ServiceModelActivity.Current.ActivityType == ActivityType.ProcessAction))
  1022. {
  1023. activity = ServiceModelActivity.Current;
  1024. emitStart = false;
  1025. }
  1026. else if (ServiceModelActivity.Current.PreviousActivity != null &&
  1027. ServiceModelActivity.Current.PreviousActivity.Id == guid)
  1028. {
  1029. activity = ServiceModelActivity.Current.PreviousActivity;
  1030. emitStart = false;
  1031. }
  1032. }
  1033. if (activity == null)
  1034. {
  1035. activity = ServiceModelActivity.CreateActivity(guid);
  1036. }
  1037. if (DiagnosticUtility.ShouldUseActivity)
  1038. {
  1039. if (emitStart)
  1040. {
  1041. if (null != FxTrace.Trace)
  1042. {
  1043. FxTrace.Trace.TraceTransfer(guid);
  1044. }
  1045. ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityProcessAction, message.Headers.Action), ActivityType.ProcessAction);
  1046. }
  1047. }
  1048. message.Properties[TraceUtility.ActivityIdKey] = activity;
  1049. }
  1050. }
  1051. static internal void UpdateAsyncOperationContextWithActivity(object activity)
  1052. {
  1053. if (OperationContext.Current != null && activity != null)
  1054. {
  1055. OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationActivityKey] = activity;
  1056. }
  1057. }
  1058. static internal object ExtractAsyncOperationContextActivity()
  1059. {
  1060. object data = null;
  1061. if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue(TraceUtility.AsyncOperationActivityKey, out data))
  1062. {
  1063. OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationActivityKey);
  1064. }
  1065. return data;
  1066. }
  1067. static internal void UpdateAsyncOperationContextWithStartTime(EventTraceActivity eventTraceActivity, long startTime)
  1068. {
  1069. if (OperationContext.Current != null)
  1070. {
  1071. OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationStartTimeKey] = new EventTraceActivityTimeProperty(eventTraceActivity, startTime);
  1072. }
  1073. }
  1074. static internal void ExtractAsyncOperationStartTime(out EventTraceActivity eventTraceActivity, out long startTime)
  1075. {
  1076. EventTraceActivityTimeProperty data = null;
  1077. eventTraceActivity = null;
  1078. startTime = 0;
  1079. if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue<EventTraceActivityTimeProperty>(TraceUtility.AsyncOperationStartTimeKey, out data))
  1080. {
  1081. OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationStartTimeKey);
  1082. eventTraceActivity = data.EventTraceActivity;
  1083. startTime = data.StartTime;
  1084. }
  1085. }
  1086. internal class TracingAsyncCallbackState
  1087. {
  1088. object innerState;
  1089. Guid activityId;
  1090. internal TracingAsyncCallbackState(object innerState)
  1091. {
  1092. this.innerState = innerState;
  1093. this.activityId = DiagnosticTraceBase.ActivityId;
  1094. }
  1095. internal object InnerState
  1096. {
  1097. get { return this.innerState; }
  1098. }
  1099. internal Guid ActivityId
  1100. {
  1101. get { return this.activityId; }
  1102. }
  1103. }
  1104. internal static AsyncCallback WrapExecuteUserCodeAsyncCallback(AsyncCallback callback)
  1105. {
  1106. return (DiagnosticUtility.ShouldUseActivity && callback != null) ?
  1107. (new ExecuteUserCodeAsync(callback)).Callback
  1108. : callback;
  1109. }
  1110. sealed class ExecuteUserCodeAsync
  1111. {
  1112. AsyncCallback callback;
  1113. public ExecuteUserCodeAsync(AsyncCallback callback)
  1114. {
  1115. this.callback = callback;
  1116. }
  1117. public AsyncCallback Callback
  1118. {
  1119. get
  1120. {
  1121. return Fx.ThunkCallback(new AsyncCallback(this.ExecuteUserCode));
  1122. }
  1123. }
  1124. void ExecuteUserCode(IAsyncResult result)
  1125. {
  1126. using (ServiceModelActivity activity = ServiceModelActivity.CreateBoundedActivity())
  1127. {
  1128. ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityCallback), ActivityType.ExecuteUserCode);
  1129. this.callback(result);
  1130. }
  1131. }
  1132. }
  1133. class EventTraceActivityTimeProperty
  1134. {
  1135. long startTime;
  1136. EventTraceActivity eventTraceActivity;
  1137. public EventTraceActivityTimeProperty(EventTraceActivity eventTraceActivity, long startTime)
  1138. {
  1139. this.eventTraceActivity = eventTraceActivity;
  1140. this.startTime = startTime;
  1141. }
  1142. internal long StartTime
  1143. {
  1144. get { return this.startTime; }
  1145. }
  1146. internal EventTraceActivity EventTraceActivity
  1147. {
  1148. get { return this.eventTraceActivity; }
  1149. }
  1150. }
  1151. internal static string GetRemoteEndpointAddressPort(Net.IPEndPoint iPEndPoint)
  1152. {
  1153. //We really don't want any exceptions out of TraceUtility.
  1154. if (iPEndPoint != null)
  1155. {
  1156. try
  1157. {
  1158. return iPEndPoint.Address.ToString() + ":" + iPEndPoint.Port;
  1159. }
  1160. catch (Exception exception)
  1161. {
  1162. if (Fx.IsFatal(exception))
  1163. {
  1164. throw;
  1165. }
  1166. //ignore and continue with all non-fatal exceptions.
  1167. }
  1168. }
  1169. return string.Empty;
  1170. }
  1171. internal static string GetRemoteEndpointAddressPort(RemoteEndpointMessageProperty remoteEndpointMessageProperty)
  1172. {
  1173. try
  1174. {
  1175. if (remoteEndpointMessageProperty != null)
  1176. {
  1177. return remoteEndpointMessageProperty.Address + ":" + remoteEndpointMessageProperty.Port;
  1178. }
  1179. }
  1180. catch (Exception exception)
  1181. {
  1182. if (Fx.IsFatal(exception))
  1183. {
  1184. throw;
  1185. }
  1186. //ignore and continue with all non-fatal exceptions.
  1187. }
  1188. return string.Empty;
  1189. }
  1190. }
  1191. }