1 //----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------------------
4 namespace System.ServiceModel.Diagnostics
6 using System.Diagnostics;
7 using System.Reflection;
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;
18 using System.ServiceModel.Diagnostics.Application;
19 using System.Globalization;
20 using System.Collections.Generic;
22 static class TraceUtility
24 const string ActivityIdKey = "ActivityId";
25 const string AsyncOperationActivityKey = "AsyncOperationActivity";
26 const string AsyncOperationStartTimeKey = "AsyncOperationStartTime";
27 static bool shouldPropagateActivity;
28 static bool shouldPropagateActivityGlobal;
29 static bool activityTracing;
30 static bool messageFlowTracing;
31 static bool messageFlowTracingOnly;
32 static long messageNumber = 0;
33 static Func<Action<AsyncCallback, IAsyncResult>> asyncCallbackGenerator;
34 static SortedList<int, string> traceCodes = new SortedList<int, string>(382)
36 // Administration trace codes (TraceCode.Administration)
37 { TraceCode.WmiPut, "WmiPut" },
39 // Diagnostic trace codes (TraceCode.Diagnostics)
40 { TraceCode.AppDomainUnload, "AppDomainUnload" },
41 { TraceCode.EventLog, "EventLog" },
42 { TraceCode.ThrowingException, "ThrowingException" },
43 { TraceCode.TraceHandledException, "TraceHandledException" },
44 { TraceCode.UnhandledException, "UnhandledException" },
45 { TraceCode.FailedToAddAnActivityIdHeader, "FailedToAddAnActivityIdHeader" },
46 { TraceCode.FailedToReadAnActivityIdHeader, "FailedToReadAnActivityIdHeader" },
47 { TraceCode.FilterNotMatchedNodeQuotaExceeded, "FilterNotMatchedNodeQuotaExceeded" },
48 { TraceCode.MessageCountLimitExceeded, "MessageCountLimitExceeded" },
49 { TraceCode.DiagnosticsFailedMessageTrace, "DiagnosticsFailedMessageTrace" },
50 { TraceCode.MessageNotLoggedQuotaExceeded, "MessageNotLoggedQuotaExceeded" },
51 { TraceCode.TraceTruncatedQuotaExceeded, "TraceTruncatedQuotaExceeded" },
52 { TraceCode.ActivityBoundary, "ActivityBoundary" },
54 // Serialization trace codes (TraceCode.Serialization)
55 { TraceCode.ElementIgnored, "" }, // shared by ServiceModel, need to investigate if should put this one in the SM section
57 // Channels trace codes (TraceCode.Channels)
58 { TraceCode.ConnectionAbandoned, "ConnectionAbandoned" },
59 { TraceCode.ConnectionPoolCloseException, "ConnectionPoolCloseException" },
60 { TraceCode.ConnectionPoolIdleTimeoutReached, "ConnectionPoolIdleTimeoutReached" },
61 { TraceCode.ConnectionPoolLeaseTimeoutReached, "ConnectionPoolLeaseTimeoutReached" },
62 { TraceCode.ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached, "ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached" },
63 { TraceCode.ServerMaxPooledConnectionsQuotaReached, "ServerMaxPooledConnectionsQuotaReached" },
64 { TraceCode.EndpointListenerClose, "EndpointListenerClose" },
65 { TraceCode.EndpointListenerOpen, "EndpointListenerOpen" },
66 { TraceCode.HttpResponseReceived, "HttpResponseReceived" },
67 { TraceCode.HttpChannelConcurrentReceiveQuotaReached, "HttpChannelConcurrentReceiveQuotaReached" },
68 { TraceCode.HttpChannelMessageReceiveFailed, "HttpChannelMessageReceiveFailed" },
69 { TraceCode.HttpChannelUnexpectedResponse, "HttpChannelUnexpectedResponse" },
70 { TraceCode.HttpChannelRequestAborted, "HttpChannelRequestAborted" },
71 { TraceCode.HttpChannelResponseAborted, "HttpChannelResponseAborted" },
72 { TraceCode.HttpsClientCertificateInvalid, "HttpsClientCertificateInvalid" },
73 { TraceCode.HttpsClientCertificateNotPresent, "HttpsClientCertificateNotPresent" },
74 { TraceCode.NamedPipeChannelMessageReceiveFailed, "NamedPipeChannelMessageReceiveFailed" },
75 { TraceCode.NamedPipeChannelMessageReceived, "NamedPipeChannelMessageReceived" },
76 { TraceCode.MessageReceived, "MessageReceived" },
77 { TraceCode.MessageSent, "MessageSent" },
78 { TraceCode.RequestChannelReplyReceived, "RequestChannelReplyReceived" },
79 { TraceCode.TcpChannelMessageReceiveFailed, "TcpChannelMessageReceiveFailed" },
80 { TraceCode.TcpChannelMessageReceived, "TcpChannelMessageReceived" },
81 { TraceCode.ConnectToIPEndpoint, "ConnectToIPEndpoint" },
82 { TraceCode.SocketConnectionCreate, "SocketConnectionCreate" },
83 { TraceCode.SocketConnectionClose, "SocketConnectionClose" },
84 { TraceCode.SocketConnectionAbort, "SocketConnectionAbort" },
85 { TraceCode.SocketConnectionAbortClose, "SocketConnectionAbortClose" },
86 { TraceCode.PipeConnectionAbort, "PipeConnectionAbort" },
87 { TraceCode.RequestContextAbort, "RequestContextAbort" },
88 { TraceCode.ChannelCreated, "ChannelCreated" },
89 { TraceCode.ChannelDisposed, "ChannelDisposed" },
90 { TraceCode.ListenerCreated, "ListenerCreated" },
91 { TraceCode.ListenerDisposed, "ListenerDisposed" },
92 { TraceCode.PrematureDatagramEof, "PrematureDatagramEof" },
93 { TraceCode.MaxPendingConnectionsReached, "MaxPendingConnectionsReached" },
94 { TraceCode.MaxAcceptedChannelsReached, "MaxAcceptedChannelsReached" },
95 { TraceCode.ChannelConnectionDropped, "ChannelConnectionDropped" },
96 { TraceCode.HttpAuthFailed, "HttpAuthFailed" },
97 { TraceCode.NoExistingTransportManager, "NoExistingTransportManager" },
98 { TraceCode.IncompatibleExistingTransportManager, "IncompatibleExistingTransportManager" },
99 { TraceCode.InitiatingNamedPipeConnection, "InitiatingNamedPipeConnection" },
100 { TraceCode.InitiatingTcpConnection, "InitiatingTcpConnection" },
101 { TraceCode.OpenedListener, "OpenedListener" },
102 { TraceCode.SslClientCertMissing, "SslClientCertMissing" },
103 { TraceCode.StreamSecurityUpgradeAccepted, "StreamSecurityUpgradeAccepted" },
104 { TraceCode.TcpConnectError, "TcpConnectError" },
105 { TraceCode.FailedAcceptFromPool, "FailedAcceptFromPool" },
106 { TraceCode.FailedPipeConnect, "FailedPipeConnect" },
107 { TraceCode.SystemTimeResolution, "SystemTimeResolution" },
108 { TraceCode.PeerNeighborCloseFailed, "PeerNeighborCloseFailed" },
109 { TraceCode.PeerNeighborClosingFailed, "PeerNeighborClosingFailed" },
110 { TraceCode.PeerNeighborNotAccepted, "PeerNeighborNotAccepted" },
111 { TraceCode.PeerNeighborNotFound, "PeerNeighborNotFound" },
112 { TraceCode.PeerNeighborOpenFailed, "PeerNeighborOpenFailed" },
113 { TraceCode.PeerNeighborStateChanged, "PeerNeighborStateChanged" },
114 { TraceCode.PeerNeighborStateChangeFailed, "PeerNeighborStateChangeFailed" },
115 { TraceCode.PeerNeighborMessageReceived, "PeerNeighborMessageReceived" },
116 { TraceCode.PeerNeighborManagerOffline, "PeerNeighborManagerOffline" },
117 { TraceCode.PeerNeighborManagerOnline, "PeerNeighborManagerOnline" },
118 { TraceCode.PeerChannelMessageReceived, "PeerChannelMessageReceived" },
119 { TraceCode.PeerChannelMessageSent, "PeerChannelMessageSent" },
120 { TraceCode.PeerNodeAddressChanged, "PeerNodeAddressChanged" },
121 { TraceCode.PeerNodeOpening, "PeerNodeOpening" },
122 { TraceCode.PeerNodeOpened, "PeerNodeOpened" },
123 { TraceCode.PeerNodeOpenFailed, "PeerNodeOpenFailed" },
124 { TraceCode.PeerNodeClosing, "PeerNodeClosing" },
125 { TraceCode.PeerNodeClosed, "PeerNodeClosed" },
126 { TraceCode.PeerFloodedMessageReceived, "PeerFloodedMessageReceived" },
127 { TraceCode.PeerFloodedMessageNotPropagated, "PeerFloodedMessageNotPropagated" },
128 { TraceCode.PeerFloodedMessageNotMatched, "PeerFloodedMessageNotMatched" },
129 { TraceCode.PnrpRegisteredAddresses, "PnrpRegisteredAddresses" },
130 { TraceCode.PnrpUnregisteredAddresses, "PnrpUnregisteredAddresses" },
131 { TraceCode.PnrpResolvedAddresses, "PnrpResolvedAddresses" },
132 { TraceCode.PnrpResolveException, "PnrpResolveException" },
133 { TraceCode.PeerReceiveMessageAuthenticationFailure, "PeerReceiveMessageAuthenticationFailure" },
134 { TraceCode.PeerNodeAuthenticationFailure, "PeerNodeAuthenticationFailure" },
135 { TraceCode.PeerNodeAuthenticationTimeout, "PeerNodeAuthenticationTimeout" },
136 { TraceCode.PeerFlooderReceiveMessageQuotaExceeded, "PeerFlooderReceiveMessageQuotaExceeded" },
137 { TraceCode.PeerServiceOpened, "PeerServiceOpened" },
138 { TraceCode.PeerMaintainerActivity, "PeerMaintainerActivity" },
139 { TraceCode.MsmqCannotPeekOnQueue, "MsmqCannotPeekOnQueue" },
140 { TraceCode.MsmqCannotReadQueues, "MsmqCannotReadQueues" },
141 { TraceCode.MsmqDatagramSent, "MsmqDatagramSent" },
142 { TraceCode.MsmqDatagramReceived, "MsmqDatagramReceived" },
143 { TraceCode.MsmqDetected, "MsmqDetected" },
144 { TraceCode.MsmqEnteredBatch, "MsmqEnteredBatch" },
145 { TraceCode.MsmqExpectedException, "MsmqExpectedException" },
146 { TraceCode.MsmqFoundBaseAddress, "MsmqFoundBaseAddress" },
147 { TraceCode.MsmqLeftBatch, "MsmqLeftBatch" },
148 { TraceCode.MsmqMatchedApplicationFound, "MsmqMatchedApplicationFound" },
149 { TraceCode.MsmqMessageDropped, "MsmqMessageDropped" },
150 { TraceCode.MsmqMessageLockedUnderTheTransaction, "MsmqMessageLockedUnderTheTransaction" },
151 { TraceCode.MsmqMessageRejected, "MsmqMessageRejected" },
152 { TraceCode.MsmqMoveOrDeleteAttemptFailed, "MsmqMoveOrDeleteAttemptFailed" },
153 { TraceCode.MsmqPoisonMessageMovedPoison, "MsmqPoisonMessageMovedPoison" },
154 { TraceCode.MsmqPoisonMessageMovedRetry, "MsmqPoisonMessageMovedRetry" },
155 { TraceCode.MsmqPoisonMessageRejected, "MsmqPoisonMessageRejected" },
156 { TraceCode.MsmqPoolFull, "MsmqPoolFull" },
157 { TraceCode.MsmqPotentiallyPoisonMessageDetected, "MsmqPotentiallyPoisonMessageDetected" },
158 { TraceCode.MsmqQueueClosed, "MsmqQueueClosed" },
159 { TraceCode.MsmqQueueOpened, "MsmqQueueOpened" },
160 { TraceCode.MsmqQueueTransactionalStatusUnknown, "MsmqQueueTransactionalStatusUnknown" },
161 { TraceCode.MsmqScanStarted, "MsmqScanStarted" },
162 { TraceCode.MsmqSessiongramReceived, "MsmqSessiongramReceived" },
163 { TraceCode.MsmqSessiongramSent, "MsmqSessiongramSent" },
164 { TraceCode.MsmqStartingApplication, "MsmqStartingApplication" },
165 { TraceCode.MsmqStartingService, "MsmqStartingService" },
166 { TraceCode.MsmqUnexpectedAcknowledgment, "MsmqUnexpectedAcknowledgment" },
167 { TraceCode.WsrmNegativeElapsedTimeDetected, "WsrmNegativeElapsedTimeDetected" },
168 { TraceCode.TcpTransferError, "TcpTransferError" },
169 { TraceCode.TcpConnectionResetError, "TcpConnectionResetError" },
170 { TraceCode.TcpConnectionTimedOut, "TcpConnectionTimedOut" },
172 // ComIntegration trace codes (TraceCode.ComIntegration)
173 { TraceCode.ComIntegrationServiceHostStartingService, "ComIntegrationServiceHostStartingService" },
174 { TraceCode.ComIntegrationServiceHostStartedService, "ComIntegrationServiceHostStartedService" },
175 { TraceCode.ComIntegrationServiceHostCreatedServiceContract, "ComIntegrationServiceHostCreatedServiceContract" },
176 { TraceCode.ComIntegrationServiceHostStartedServiceDetails, "ComIntegrationServiceHostStartedServiceDetails" },
177 { TraceCode.ComIntegrationServiceHostCreatedServiceEndpoint, "ComIntegrationServiceHostCreatedServiceEndpoint" },
178 { TraceCode.ComIntegrationServiceHostStoppingService, "ComIntegrationServiceHostStoppingService" },
179 { TraceCode.ComIntegrationServiceHostStoppedService, "ComIntegrationServiceHostStoppedService" },
180 { TraceCode.ComIntegrationDllHostInitializerStarting, "ComIntegrationDllHostInitializerStarting" },
181 { TraceCode.ComIntegrationDllHostInitializerAddingHost, "ComIntegrationDllHostInitializerAddingHost" },
182 { TraceCode.ComIntegrationDllHostInitializerStarted, "ComIntegrationDllHostInitializerStarted" },
183 { TraceCode.ComIntegrationDllHostInitializerStopping, "ComIntegrationDllHostInitializerStopping" },
184 { TraceCode.ComIntegrationDllHostInitializerStopped, "ComIntegrationDllHostInitializerStopped" },
185 { TraceCode.ComIntegrationTLBImportStarting, "ComIntegrationTLBImportStarting" },
186 { TraceCode.ComIntegrationTLBImportFromAssembly, "ComIntegrationTLBImportFromAssembly" },
187 { TraceCode.ComIntegrationTLBImportFromTypelib, "ComIntegrationTLBImportFromTypelib" },
188 { TraceCode.ComIntegrationTLBImportConverterEvent, "ComIntegrationTLBImportConverterEvent" },
189 { TraceCode.ComIntegrationTLBImportFinished, "ComIntegrationTLBImportFinished" },
190 { TraceCode.ComIntegrationInstanceCreationRequest, "ComIntegrationInstanceCreationRequest" },
191 { TraceCode.ComIntegrationInstanceCreationSuccess, "ComIntegrationInstanceCreationSuccess" },
192 { TraceCode.ComIntegrationInstanceReleased, "ComIntegrationInstanceReleased" },
193 { TraceCode.ComIntegrationEnteringActivity, "ComIntegrationEnteringActivity" },
194 { TraceCode.ComIntegrationExecutingCall, "ComIntegrationExecutingCall" },
195 { TraceCode.ComIntegrationLeftActivity, "ComIntegrationLeftActivity" },
196 { TraceCode.ComIntegrationInvokingMethod, "ComIntegrationInvokingMethod" },
197 { TraceCode.ComIntegrationInvokedMethod, "ComIntegrationInvokedMethod" },
198 { TraceCode.ComIntegrationInvokingMethodNewTransaction, "ComIntegrationInvokingMethodNewTransaction" },
199 { TraceCode.ComIntegrationInvokingMethodContextTransaction, "ComIntegrationInvokingMethodContextTransaction" },
200 { TraceCode.ComIntegrationServiceMonikerParsed, "ComIntegrationServiceMonikerParsed" },
201 { TraceCode.ComIntegrationWsdlChannelBuilderLoaded, "ComIntegrationWsdlChannelBuilderLoaded" },
202 { TraceCode.ComIntegrationTypedChannelBuilderLoaded, "ComIntegrationTypedChannelBuilderLoaded" },
203 { TraceCode.ComIntegrationChannelCreated, "ComIntegrationChannelCreated" },
204 { TraceCode.ComIntegrationDispatchMethod, "ComIntegrationDispatchMethod" },
205 { TraceCode.ComIntegrationTxProxyTxCommitted, "ComIntegrationTxProxyTxCommitted" },
206 { TraceCode.ComIntegrationTxProxyTxAbortedByContext, "ComIntegrationTxProxyTxAbortedByContext" },
207 { TraceCode.ComIntegrationTxProxyTxAbortedByTM, "ComIntegrationTxProxyTxAbortedByTM" },
208 { TraceCode.ComIntegrationMexMonikerMetadataExchangeComplete, "ComIntegrationMexMonikerMetadataExchangeComplete" },
209 { TraceCode.ComIntegrationMexChannelBuilderLoaded, "ComIntegrationMexChannelBuilderLoaded" },
211 // Security trace codes (TraceCode.Security)
212 { TraceCode.Security, "Security" },
213 { TraceCode.SecurityIdentityVerificationSuccess, "SecurityIdentityVerificationSuccess" },
214 { TraceCode.SecurityIdentityVerificationFailure, "SecurityIdentityVerificationFailure" },
215 { TraceCode.SecurityIdentityDeterminationSuccess, "SecurityIdentityDeterminationSuccess" },
216 { TraceCode.SecurityIdentityDeterminationFailure, "SecurityIdentityDeterminationFailure" },
217 { TraceCode.SecurityIdentityHostNameNormalizationFailure, "SecurityIdentityHostNameNormalizationFailure" },
218 { TraceCode.SecurityImpersonationSuccess, "SecurityImpersonationSuccess" },
219 { TraceCode.SecurityImpersonationFailure, "SecurityImpersonationFailure" },
220 { TraceCode.SecurityNegotiationProcessingFailure, "SecurityNegotiationProcessingFailure" },
221 { TraceCode.IssuanceTokenProviderRemovedCachedToken, "IssuanceTokenProviderRemovedCachedToken" },
222 { TraceCode.IssuanceTokenProviderUsingCachedToken, "IssuanceTokenProviderUsingCachedToken" },
223 { TraceCode.IssuanceTokenProviderBeginSecurityNegotiation, "IssuanceTokenProviderBeginSecurityNegotiation" },
224 { TraceCode.IssuanceTokenProviderEndSecurityNegotiation, "IssuanceTokenProviderEndSecurityNegotiation" },
225 { TraceCode.IssuanceTokenProviderRedirectApplied, "IssuanceTokenProviderRedirectApplied" },
226 { TraceCode.IssuanceTokenProviderServiceTokenCacheFull, "IssuanceTokenProviderServiceTokenCacheFull" },
227 { TraceCode.NegotiationTokenProviderAttached, "NegotiationTokenProviderAttached" },
228 { TraceCode.SpnegoClientNegotiationCompleted, "SpnegoClientNegotiationCompleted" },
229 { TraceCode.SpnegoServiceNegotiationCompleted, "SpnegoServiceNegotiationCompleted" },
230 { TraceCode.SpnegoClientNegotiation, "SpnegoClientNegotiation" },
231 { TraceCode.SpnegoServiceNegotiation, "SpnegoServiceNegotiation" },
232 { TraceCode.NegotiationAuthenticatorAttached, "NegotiationAuthenticatorAttached" },
233 { TraceCode.ServiceSecurityNegotiationCompleted, "ServiceSecurityNegotiationCompleted" },
234 { TraceCode.SecurityContextTokenCacheFull, "SecurityContextTokenCacheFull" },
235 { TraceCode.ExportSecurityChannelBindingEntry, "ExportSecurityChannelBindingEntry" },
236 { TraceCode.ExportSecurityChannelBindingExit, "ExportSecurityChannelBindingExit" },
237 { TraceCode.ImportSecurityChannelBindingEntry, "ImportSecurityChannelBindingEntry" },
238 { TraceCode.ImportSecurityChannelBindingExit, "ImportSecurityChannelBindingExit" },
239 { TraceCode.SecurityTokenProviderOpened, "SecurityTokenProviderOpened" },
240 { TraceCode.SecurityTokenProviderClosed, "SecurityTokenProviderClosed" },
241 { TraceCode.SecurityTokenAuthenticatorOpened, "SecurityTokenAuthenticatorOpened" },
242 { TraceCode.SecurityTokenAuthenticatorClosed, "SecurityTokenAuthenticatorClosed" },
243 { TraceCode.SecurityBindingOutgoingMessageSecured, "SecurityBindingOutgoingMessageSecured" },
244 { TraceCode.SecurityBindingIncomingMessageVerified, "SecurityBindingIncomingMessageVerified" },
245 { TraceCode.SecurityBindingSecureOutgoingMessageFailure, "SecurityBindingSecureOutgoingMessageFailure" },
246 { TraceCode.SecurityBindingVerifyIncomingMessageFailure, "SecurityBindingVerifyIncomingMessageFailure" },
247 { TraceCode.SecuritySpnToSidMappingFailure, "SecuritySpnToSidMappingFailure" },
248 { TraceCode.SecuritySessionRedirectApplied, "SecuritySessionRedirectApplied" },
249 { TraceCode.SecurityClientSessionCloseSent, "SecurityClientSessionCloseSent" },
250 { TraceCode.SecurityClientSessionCloseResponseSent, "SecurityClientSessionCloseResponseSent" },
251 { TraceCode.SecurityClientSessionCloseMessageReceived, "SecurityClientSessionCloseMessageReceived" },
252 { TraceCode.SecuritySessionKeyRenewalFaultReceived, "SecuritySessionKeyRenewalFaultReceived" },
253 { TraceCode.SecuritySessionAbortedFaultReceived, "SecuritySessionAbortedFaultReceived" },
254 { TraceCode.SecuritySessionClosedResponseReceived, "SecuritySessionClosedResponseReceived" },
255 { TraceCode.SecurityClientSessionPreviousKeyDiscarded, "SecurityClientSessionPreviousKeyDiscarded" },
256 { TraceCode.SecurityClientSessionKeyRenewed, "SecurityClientSessionKeyRenewed" },
257 { TraceCode.SecurityPendingServerSessionAdded, "SecurityPendingServerSessionAdded" },
258 { TraceCode.SecurityPendingServerSessionClosed, "SecurityPendingServerSessionClosed" },
259 { TraceCode.SecurityPendingServerSessionActivated, "SecurityPendingServerSessionActivated" },
260 { TraceCode.SecurityActiveServerSessionRemoved, "SecurityActiveServerSessionRemoved" },
261 { TraceCode.SecurityNewServerSessionKeyIssued, "SecurityNewServerSessionKeyIssued" },
262 { TraceCode.SecurityInactiveSessionFaulted, "SecurityInactiveSessionFaulted" },
263 { TraceCode.SecurityServerSessionKeyUpdated, "SecurityServerSessionKeyUpdated" },
264 { TraceCode.SecurityServerSessionCloseReceived, "SecurityServerSessionCloseReceived" },
265 { TraceCode.SecurityServerSessionRenewalFaultSent, "SecurityServerSessionRenewalFaultSent" },
266 { TraceCode.SecurityServerSessionAbortedFaultSent, "SecurityServerSessionAbortedFaultSent" },
267 { TraceCode.SecuritySessionCloseResponseSent, "SecuritySessionCloseResponseSent" },
268 { TraceCode.SecuritySessionServerCloseSent, "SecuritySessionServerCloseSent" },
269 { TraceCode.SecurityServerSessionCloseResponseReceived, "SecurityServerSessionCloseResponseReceived" },
270 { TraceCode.SecuritySessionRenewFaultSendFailure, "SecuritySessionRenewFaultSendFailure" },
271 { TraceCode.SecuritySessionAbortedFaultSendFailure, "SecuritySessionAbortedFaultSendFailure" },
272 { TraceCode.SecuritySessionClosedResponseSendFailure, "SecuritySessionClosedResponseSendFailure" },
273 { TraceCode.SecuritySessionServerCloseSendFailure, "SecuritySessionServerCloseSendFailure" },
274 { TraceCode.SecuritySessionRequestorStartOperation, "SecuritySessionRequestorStartOperation" },
275 { TraceCode.SecuritySessionRequestorOperationSuccess, "SecuritySessionRequestorOperationSuccess" },
276 { TraceCode.SecuritySessionRequestorOperationFailure, "SecuritySessionRequestorOperationFailure" },
277 { TraceCode.SecuritySessionResponderOperationFailure, "SecuritySessionResponderOperationFailure" },
278 { TraceCode.SecuritySessionDemuxFailure, "SecuritySessionDemuxFailure" },
279 { TraceCode.SecurityAuditWrittenSuccess, "SecurityAuditWrittenSuccess" },
280 { TraceCode.SecurityAuditWrittenFailure, "SecurityAuditWrittenFailure" },
282 // ServiceModel trace codes (TraceCode.ServiceModel)
283 { TraceCode.AsyncCallbackThrewException, "AsyncCallbackThrewException" },
284 { TraceCode.CommunicationObjectAborted, "CommunicationObjectAborted" },
285 { TraceCode.CommunicationObjectAbortFailed, "CommunicationObjectAbortFailed" },
286 { TraceCode.CommunicationObjectCloseFailed, "CommunicationObjectCloseFailed" },
287 { TraceCode.CommunicationObjectOpenFailed, "CommunicationObjectOpenFailed" },
288 { TraceCode.CommunicationObjectClosing, "CommunicationObjectClosing" },
289 { TraceCode.CommunicationObjectClosed, "CommunicationObjectClosed" },
290 { TraceCode.CommunicationObjectCreated, "CommunicationObjectCreated" },
291 { TraceCode.CommunicationObjectDisposing, "CommunicationObjectDisposing" },
292 { TraceCode.CommunicationObjectFaultReason, "CommunicationObjectFaultReason" },
293 { TraceCode.CommunicationObjectFaulted, "CommunicationObjectFaulted" },
294 { TraceCode.CommunicationObjectOpening, "CommunicationObjectOpening" },
295 { TraceCode.CommunicationObjectOpened, "CommunicationObjectOpened" },
296 { TraceCode.DidNotUnderstandMessageHeader, "DidNotUnderstandMessageHeader" },
297 { TraceCode.UnderstoodMessageHeader, "UnderstoodMessageHeader" },
298 { TraceCode.MessageClosed, "MessageClosed" },
299 { TraceCode.MessageClosedAgain, "MessageClosedAgain" },
300 { TraceCode.MessageCopied, "MessageCopied" },
301 { TraceCode.MessageRead, "MessageRead" },
302 { TraceCode.MessageWritten, "MessageWritten" },
303 { TraceCode.BeginExecuteMethod, "BeginExecuteMethod" },
304 { TraceCode.ConfigurationIsReadOnly, "ConfigurationIsReadOnly" },
305 { TraceCode.ConfiguredExtensionTypeNotFound, "ConfiguredExtensionTypeNotFound" },
306 { TraceCode.EvaluationContextNotFound, "EvaluationContextNotFound" },
307 { TraceCode.EndExecuteMethod, "EndExecuteMethod" },
308 { TraceCode.ExtensionCollectionDoesNotExist, "ExtensionCollectionDoesNotExist" },
309 { TraceCode.ExtensionCollectionNameNotFound, "ExtensionCollectionNameNotFound" },
310 { TraceCode.ExtensionCollectionIsEmpty, "ExtensionCollectionIsEmpty" },
311 { TraceCode.ExtensionElementAlreadyExistsInCollection, "ExtensionElementAlreadyExistsInCollection" },
312 { TraceCode.ElementTypeDoesntMatchConfiguredType, "ElementTypeDoesntMatchConfiguredType" },
313 { TraceCode.ErrorInvokingUserCode, "ErrorInvokingUserCode" },
314 { TraceCode.GetBehaviorElement, "GetBehaviorElement" },
315 { TraceCode.GetCommonBehaviors, "GetCommonBehaviors" },
316 { TraceCode.GetConfiguredBinding, "GetConfiguredBinding" },
317 { TraceCode.GetChannelEndpointElement, "GetChannelEndpointElement" },
318 { TraceCode.GetConfigurationSection, "GetConfigurationSection" },
319 { TraceCode.GetDefaultConfiguredBinding, "GetDefaultConfiguredBinding" },
320 { TraceCode.GetServiceElement, "GetServiceElement" },
321 { TraceCode.MessageProcessingPaused, "MessageProcessingPaused" },
322 { TraceCode.ManualFlowThrottleLimitReached, "ManualFlowThrottleLimitReached" },
323 { TraceCode.OverridingDuplicateConfigurationKey, "OverridingDuplicateConfigurationKey" },
324 { TraceCode.RemoveBehavior, "RemoveBehavior" },
325 { TraceCode.ServiceChannelLifetime, "ServiceChannelLifetime" },
326 { TraceCode.ServiceHostCreation, "ServiceHostCreation" },
327 { TraceCode.ServiceHostBaseAddresses, "ServiceHostBaseAddresses" },
328 { TraceCode.ServiceHostTimeoutOnClose, "ServiceHostTimeoutOnClose" },
329 { TraceCode.ServiceHostFaulted, "ServiceHostFaulted" },
330 { TraceCode.ServiceHostErrorOnReleasePerformanceCounter, "ServiceHostErrorOnReleasePerformanceCounter" },
331 { TraceCode.ServiceThrottleLimitReached, "ServiceThrottleLimitReached" },
332 { TraceCode.ServiceOperationMissingReply, "ServiceOperationMissingReply" },
333 { TraceCode.ServiceOperationMissingReplyContext, "ServiceOperationMissingReplyContext" },
334 { TraceCode.ServiceOperationExceptionOnReply, "ServiceOperationExceptionOnReply" },
335 { TraceCode.SkipBehavior, "SkipBehavior" },
336 { TraceCode.TransportListen, "TransportListen" },
337 { TraceCode.UnhandledAction, "UnhandledAction" },
338 { TraceCode.PerformanceCounterFailedToLoad, "PerformanceCounterFailedToLoad" },
339 { TraceCode.PerformanceCountersFailed, "PerformanceCountersFailed" },
340 { TraceCode.PerformanceCountersFailedDuringUpdate, "PerformanceCountersFailedDuringUpdate" },
341 { TraceCode.PerformanceCountersFailedForService, "PerformanceCountersFailedForService" },
342 { TraceCode.PerformanceCountersFailedOnRelease, "PerformanceCountersFailedOnRelease" },
343 { TraceCode.WsmexNonCriticalWsdlExportError, "WsmexNonCriticalWsdlExportError" },
344 { TraceCode.WsmexNonCriticalWsdlImportError, "WsmexNonCriticalWsdlImportError" },
345 { TraceCode.FailedToOpenIncomingChannel, "FailedToOpenIncomingChannel" },
346 { TraceCode.UnhandledExceptionInUserOperation, "UnhandledExceptionInUserOperation" },
347 { TraceCode.DroppedAMessage, "DroppedAMessage" },
348 { TraceCode.CannotBeImportedInCurrentFormat, "CannotBeImportedInCurrentFormat" },
349 { TraceCode.GetConfiguredEndpoint, "GetConfiguredEndpoint" },
350 { TraceCode.GetDefaultConfiguredEndpoint, "GetDefaultConfiguredEndpoint" },
351 { TraceCode.ExtensionTypeNotFound, "ExtensionTypeNotFound" },
352 { TraceCode.DefaultEndpointsAdded, "DefaultEndpointsAdded" },
354 //ServiceModel Metadata codes
355 { TraceCode.MetadataExchangeClientSendRequest, "MetadataExchangeClientSendRequest" },
356 { TraceCode.MetadataExchangeClientReceiveReply, "MetadataExchangeClientReceiveReply" },
357 { TraceCode.WarnHelpPageEnabledNoBaseAddress, "WarnHelpPageEnabledNoBaseAddress" },
359 // PortSharingtrace codes (TraceCode.PortSharing)
360 { TraceCode.PortSharingClosed, "PortSharingClosed" },
361 { TraceCode.PortSharingDuplicatedPipe, "PortSharingDuplicatedPipe" },
362 { TraceCode.PortSharingDupHandleGranted, "PortSharingDupHandleGranted" },
363 { TraceCode.PortSharingDuplicatedSocket, "PortSharingDuplicatedSocket" },
364 { TraceCode.PortSharingListening, "PortSharingListening" },
365 { TraceCode.SharedManagerServiceEndpointNotExist, "SharedManagerServiceEndpointNotExist" },
367 //Indigo Tx trace codes (TraceCode.ServiceModelTransaction)
368 { TraceCode.TxSourceTxScopeRequiredIsTransactedTransport, "TxSourceTxScopeRequiredIsTransactedTransport" },
369 { TraceCode.TxSourceTxScopeRequiredIsTransactionFlow, "TxSourceTxScopeRequiredIsTransactionFlow" },
370 { TraceCode.TxSourceTxScopeRequiredIsAttachedTransaction, "TxSourceTxScopeRequiredIsAttachedTransaction" },
371 { TraceCode.TxSourceTxScopeRequiredIsCreateNewTransaction, "TxSourceTxScopeRequiredIsCreateNewTransaction" },
372 { TraceCode.TxCompletionStatusCompletedForAutocomplete, "TxCompletionStatusCompletedForAutocomplete" },
373 { TraceCode.TxCompletionStatusCompletedForError, "TxCompletionStatusCompletedForError" },
374 { TraceCode.TxCompletionStatusCompletedForSetComplete, "TxCompletionStatusCompletedForSetComplete" },
375 { TraceCode.TxCompletionStatusCompletedForTACOSC, "TxCompletionStatusCompletedForTACOSC" },
376 { TraceCode.TxCompletionStatusCompletedForAsyncAbort, "TxCompletionStatusCompletedForAsyncAbort" },
377 { TraceCode.TxCompletionStatusRemainsAttached, "TxCompletionStatusRemainsAttached" },
378 { TraceCode.TxCompletionStatusAbortedOnSessionClose, "TxCompletionStatusAbortedOnSessionClose" },
379 { TraceCode.TxReleaseServiceInstanceOnCompletion, "TxReleaseServiceInstanceOnCompletion" },
380 { TraceCode.TxAsyncAbort, "TxAsyncAbort" },
381 { TraceCode.TxFailedToNegotiateOleTx, "TxFailedToNegotiateOleTx" },
382 { TraceCode.TxSourceTxScopeRequiredUsingExistingTransaction, "TxSourceTxScopeRequiredUsingExistingTransaction" },
384 //CfxGreen trace codes (TraceCode.NetFx35)
385 { TraceCode.ActivatingMessageReceived, "ActivatingMessageReceived" },
386 { TraceCode.InstanceContextBoundToDurableInstance, "InstanceContextBoundToDurableInstance" },
387 { TraceCode.InstanceContextDetachedFromDurableInstance, "InstanceContextDetachedFromDurableInstance" },
388 { TraceCode.ContextChannelFactoryChannelCreated, "ContextChannelFactoryChannelCreated" },
389 { TraceCode.ContextChannelListenerChannelAccepted, "ContextChannelListenerChannelAccepted" },
390 { TraceCode.ContextProtocolContextAddedToMessage, "ContextProtocolContextAddedToMessage" },
391 { TraceCode.ContextProtocolContextRetrievedFromMessage, "ContextProtocolContextRetrievedFromMessage" },
392 { TraceCode.DICPInstanceContextCached, "DICPInstanceContextCached" },
393 { TraceCode.DICPInstanceContextRemovedFromCache, "DICPInstanceContextRemovedFromCache" },
394 { TraceCode.ServiceDurableInstanceDeleted, "ServiceDurableInstanceDeleted" },
395 { TraceCode.ServiceDurableInstanceDisposed, "ServiceDurableInstanceDisposed" },
396 { TraceCode.ServiceDurableInstanceLoaded, "ServiceDurableInstanceLoaded" },
397 { TraceCode.ServiceDurableInstanceSaved, "ServiceDurableInstanceSaved" },
398 { TraceCode.SqlPersistenceProviderSQLCallStart, "SqlPersistenceProviderSQLCallStart" },
399 { TraceCode.SqlPersistenceProviderSQLCallEnd, "SqlPersistenceProviderSQLCallEnd" },
400 { TraceCode.SqlPersistenceProviderOpenParameters, "SqlPersistenceProviderOpenParameters" },
401 { TraceCode.SyncContextSchedulerServiceTimerCancelled, "SyncContextSchedulerServiceTimerCancelled" },
402 { TraceCode.SyncContextSchedulerServiceTimerCreated, "SyncContextSchedulerServiceTimerCreated" },
403 { TraceCode.WorkflowDurableInstanceLoaded, "WorkflowDurableInstanceLoaded" },
404 { TraceCode.WorkflowDurableInstanceAborted, "WorkflowDurableInstanceAborted" },
405 { TraceCode.WorkflowDurableInstanceActivated, "WorkflowDurableInstanceActivated" },
406 { TraceCode.WorkflowOperationInvokerItemQueued, "WorkflowOperationInvokerItemQueued" },
407 { TraceCode.WorkflowRequestContextReplySent, "WorkflowRequestContextReplySent" },
408 { TraceCode.WorkflowRequestContextFaultSent, "WorkflowRequestContextFaultSent" },
409 { TraceCode.WorkflowServiceHostCreated, "WorkflowServiceHostCreated" },
410 { TraceCode.SyndicationReadFeedBegin, "SyndicationReadFeedBegin" },
411 { TraceCode.SyndicationReadFeedEnd, "SyndicationReadFeedEnd" },
412 { TraceCode.SyndicationReadItemBegin, "SyndicationReadItemBegin" },
413 { TraceCode.SyndicationReadItemEnd, "SyndicationReadItemEnd" },
414 { TraceCode.SyndicationWriteFeedBegin, "SyndicationWriteFeedBegin" },
415 { TraceCode.SyndicationWriteFeedEnd, "SyndicationWriteFeedEnd" },
416 { TraceCode.SyndicationWriteItemBegin, "SyndicationWriteItemBegin" },
417 { TraceCode.SyndicationWriteItemEnd, "SyndicationWriteItemEnd" },
418 { TraceCode.SyndicationProtocolElementIgnoredOnRead, "SyndicationProtocolElementIgnoredOnRead" },
419 { TraceCode.SyndicationProtocolElementIgnoredOnWrite, "SyndicationProtocolElementIgnoredOnWrite" },
420 { TraceCode.SyndicationProtocolElementInvalid, "SyndicationProtocolElementInvalid" },
421 { TraceCode.WebUnknownQueryParameterIgnored, "WebUnknownQueryParameterIgnored" },
422 { TraceCode.WebRequestMatchesOperation, "WebRequestMatchesOperation" },
423 { TraceCode.WebRequestDoesNotMatchOperations, "WebRequestDoesNotMatchOperations" },
424 { TraceCode.WebRequestRedirect, "WebRequestRedirect" },
425 { TraceCode.SyndicationReadServiceDocumentBegin, "SyndicationReadServiceDocumentBegin" },
426 { TraceCode.SyndicationReadServiceDocumentEnd, "SyndicationReadServiceDocumentEnd" },
427 { TraceCode.SyndicationReadCategoriesDocumentBegin, "SyndicationReadCategoriesDocumentBegin" },
428 { TraceCode.SyndicationReadCategoriesDocumentEnd, "SyndicationReadCategoriesDocumentEnd" },
429 { TraceCode.SyndicationWriteServiceDocumentBegin, "SyndicationWriteServiceDocumentBegin" },
430 { TraceCode.SyndicationWriteServiceDocumentEnd, "SyndicationWriteServiceDocumentEnd" },
431 { TraceCode.SyndicationWriteCategoriesDocumentBegin, "SyndicationWriteCategoriesDocumentBegin" },
432 { TraceCode.SyndicationWriteCategoriesDocumentEnd, "SyndicationWriteCategoriesDocumentEnd" },
433 { TraceCode.AutomaticFormatSelectedOperationDefault, "AutomaticFormatSelectedOperationDefault" },
434 { TraceCode.AutomaticFormatSelectedRequestBased, "AutomaticFormatSelectedRequestBased" },
435 { TraceCode.RequestFormatSelectedFromContentTypeMapper, "RequestFormatSelectedFromContentTypeMapper" },
436 { TraceCode.RequestFormatSelectedByEncoderDefaults, "RequestFormatSelectedByEncoderDefaults" },
437 { TraceCode.AddingResponseToOutputCache, "AddingResponseToOutputCache" },
438 { TraceCode.AddingAuthenticatedResponseToOutputCache, "AddingAuthenticatedResponseToOutputCache" },
439 { TraceCode.JsonpCallbackNameSet, "JsonpCallbackNameSet" },
442 public const string E2EActivityId = "E2EActivityId";
443 public const string TraceApplicationReference = "TraceApplicationReference";
445 public static InputQueue<T> CreateInputQueue<T>() where T : class
447 if (asyncCallbackGenerator == null)
449 asyncCallbackGenerator = new Func<Action<AsyncCallback, IAsyncResult>>(CallbackGenerator);
452 return new InputQueue<T>(asyncCallbackGenerator)
454 DisposeItemCallback = value =>
456 if (value is ICommunicationObject)
458 ((ICommunicationObject)value).Abort();
464 static Action<AsyncCallback, IAsyncResult> CallbackGenerator()
466 if (DiagnosticUtility.ShouldUseActivity)
468 ServiceModelActivity callbackActivity = ServiceModelActivity.Current;
469 if (callbackActivity != null)
471 return delegate(AsyncCallback callback, IAsyncResult result)
473 using (ServiceModelActivity.BoundOperation(callbackActivity))
483 static internal void AddActivityHeader(Message message)
487 ActivityIdHeader activityIdHeader = new ActivityIdHeader(TraceUtility.ExtractActivityId(message));
488 activityIdHeader.AddTo(message);
490 #pragma warning suppress 56500 // covered by FxCOP
497 TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
498 SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
502 static internal void AddAmbientActivityToMessage(Message message)
506 ActivityIdHeader activityIdHeader = new ActivityIdHeader(DiagnosticTraceBase.ActivityId);
507 activityIdHeader.AddTo(message);
509 #pragma warning suppress 56500 // covered by FxCOP
516 TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
517 SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
521 static internal void CopyActivity(Message source, Message destination)
523 if (DiagnosticUtility.ShouldUseActivity)
525 TraceUtility.SetActivity(destination, TraceUtility.ExtractActivity(source));
529 internal static long GetUtcBasedDurationForTrace(long startTicks)
533 TimeSpan elapsedTime = new TimeSpan(DateTime.UtcNow.Ticks - startTicks);
534 return (long)elapsedTime.TotalMilliseconds;
539 internal static ServiceModelActivity ExtractActivity(Message message)
541 ServiceModelActivity retval = null;
543 if ((DiagnosticUtility.ShouldUseActivity || TraceUtility.ShouldPropagateActivityGlobal) &&
545 (message.State != MessageState.Closed))
549 if (message.Properties.TryGetValue(TraceUtility.ActivityIdKey, out property))
551 retval = property as ServiceModelActivity;
557 internal static Guid ExtractActivityId(Message message)
559 if (TraceUtility.MessageFlowTracingOnly)
561 return ActivityIdHeader.ExtractActivityId(message);
564 ServiceModelActivity activity = ExtractActivity(message);
565 return activity == null ? Guid.Empty : activity.Id;
568 internal static Guid GetReceivedActivityId(OperationContext operationContext)
570 object activityIdFromProprties;
571 if (!operationContext.IncomingMessageProperties.TryGetValue(E2EActivityId, out activityIdFromProprties))
573 return TraceUtility.ExtractActivityId(operationContext.IncomingMessage);
577 return (Guid)activityIdFromProprties;
581 internal static ServiceModelActivity ExtractAndRemoveActivity(Message message)
583 ServiceModelActivity retval = TraceUtility.ExtractActivity(message);
586 // If the property is just removed, the item is disposed and we don't want the thing
587 // to be disposed of.
588 message.Properties[TraceUtility.ActivityIdKey] = false;
593 internal static void ProcessIncomingMessage(Message message, EventTraceActivity eventTraceActivity)
595 ServiceModelActivity activity = ServiceModelActivity.Current;
596 if (activity != null && DiagnosticUtility.ShouldUseActivity)
598 ServiceModelActivity incomingActivity = TraceUtility.ExtractActivity(message);
599 if (null != incomingActivity && incomingActivity.Id != activity.Id)
601 using (ServiceModelActivity.BoundOperation(incomingActivity))
603 if (null != FxTrace.Trace)
605 FxTrace.Trace.TraceTransfer(activity.Id);
609 TraceUtility.SetActivity(message, activity);
612 TraceUtility.MessageFlowAtMessageReceived(message, null, eventTraceActivity, true);
614 if (MessageLogger.LogMessagesAtServiceLevel)
616 MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelReceiveReply | MessageLoggingSource.LastChance);
620 internal static void ProcessOutgoingMessage(Message message, EventTraceActivity eventTraceActivity)
622 ServiceModelActivity activity = ServiceModelActivity.Current;
623 if (DiagnosticUtility.ShouldUseActivity)
625 TraceUtility.SetActivity(message, activity);
627 if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity)
629 TraceUtility.AddAmbientActivityToMessage(message);
632 TraceUtility.MessageFlowAtMessageSent(message, eventTraceActivity);
634 if (MessageLogger.LogMessagesAtServiceLevel)
636 MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelSendRequest | MessageLoggingSource.LastChance);
640 internal static void SetActivity(Message message, ServiceModelActivity activity)
642 if (DiagnosticUtility.ShouldUseActivity && message != null && message.State != MessageState.Closed)
644 message.Properties[TraceUtility.ActivityIdKey] = activity;
648 internal static void TraceDroppedMessage(Message message, EndpointDispatcher dispatcher)
650 if (DiagnosticUtility.ShouldTraceInformation)
652 EndpointAddress endpointAddress = null;
653 if (dispatcher != null)
655 endpointAddress = dispatcher.EndpointAddress;
657 TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.DroppedAMessage,
658 SR.GetString(SR.TraceCodeDroppedAMessage), new MessageDroppedTraceRecord(message, endpointAddress));
662 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription)
664 TraceEvent(severity, traceCode, traceDescription, null, traceDescription, (Exception)null);
667 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData)
669 TraceEvent(severity, traceCode, traceDescription, extendedData, null, (Exception)null);
672 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source)
674 TraceEvent(severity, traceCode, traceDescription, null, source, (Exception)null);
677 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Exception exception)
679 TraceEvent(severity, traceCode, traceDescription, null, source, exception);
682 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Message message)
686 TraceEvent(severity, traceCode, traceDescription, null, (Exception)null);
690 TraceEvent(severity, traceCode, traceDescription, message, message);
694 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Message message)
696 Guid activityId = TraceUtility.ExtractActivityId(message);
697 if (DiagnosticUtility.ShouldTrace(severity))
699 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), null, activityId, message);
703 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Exception exception, Message message)
705 Guid activityId = TraceUtility.ExtractActivityId(message);
706 if (DiagnosticUtility.ShouldTrace(severity))
708 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), exception, activityId, null);
712 internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
714 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
717 // These methods require a TraceRecord to be allocated, so we want them to show up on profiles if the caller didn't avoid
718 // allocating the TraceRecord by using ShouldTrace.
719 [MethodImpl(MethodImplOptions.NoInlining)]
720 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
722 if (DiagnosticUtility.ShouldTrace(severity))
724 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
728 [MethodImpl(MethodImplOptions.NoInlining)]
729 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Message message)
731 Guid activityId = TraceUtility.ExtractActivityId(message);
732 if (DiagnosticUtility.ShouldTrace(severity))
734 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
735 traceDescription, extendedData, exception, activityId, source);
739 internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
741 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
742 traceDescription, extendedData, exception, activityId, source);
745 [MethodImpl(MethodImplOptions.NoInlining)]
746 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
748 if (DiagnosticUtility.ShouldTrace(severity))
750 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
751 traceDescription, extendedData, exception, activityId, source);
755 static string GenerateMsdnTraceCode(int traceCode)
757 int group = (int)(traceCode & 0xFFFF0000);
758 string terminatorUri = null;
761 case TraceCode.Administration:
762 terminatorUri = "System.ServiceModel.Administration";
764 case TraceCode.Channels:
765 terminatorUri = "System.ServiceModel.Channels";
767 case TraceCode.ComIntegration:
768 terminatorUri = "System.ServiceModel.ComIntegration";
770 case TraceCode.Diagnostics:
771 terminatorUri = "System.ServiceModel.Diagnostics";
773 case TraceCode.PortSharing:
774 terminatorUri = "System.ServiceModel.PortSharing";
776 case TraceCode.Security:
777 terminatorUri = "System.ServiceModel.Security";
779 case TraceCode.Serialization:
780 terminatorUri = "System.Runtime.Serialization";
782 case TraceCode.ServiceModel:
783 case TraceCode.ServiceModelTransaction:
784 terminatorUri = "System.ServiceModel";
787 terminatorUri = string.Empty;
791 Fx.Assert(traceCodes.ContainsKey(traceCode),
792 string.Format(CultureInfo.InvariantCulture, "Unsupported trace code: Please add trace code 0x{0} to the SortedList TraceUtility.traceCodes in {1}",
793 traceCode.ToString("X", CultureInfo.InvariantCulture), typeof(TraceUtility)));
795 return LegacyDiagnosticTrace.GenerateMsdnTraceCode(terminatorUri, traceCodes[traceCode]);
801 internal static Exception ThrowHelperError(Exception exception, Message message)
803 // If the message is closed, we won't get an activity
804 Guid activityId = TraceUtility.ExtractActivityId(message);
805 if (DiagnosticUtility.ShouldTraceError)
807 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
808 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
813 internal static Exception ThrowHelperError(Exception exception, Guid activityId, object source)
815 if (DiagnosticUtility.ShouldTraceError)
817 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
818 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, source);
823 internal static Exception ThrowHelperWarning(Exception exception, Message message)
825 if (DiagnosticUtility.ShouldTraceWarning)
827 Guid activityId = TraceUtility.ExtractActivityId(message);
828 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
829 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
834 internal static ArgumentException ThrowHelperArgument(string paramName, string message, Message msg)
836 return (ArgumentException)TraceUtility.ThrowHelperError(new ArgumentException(message, paramName), msg);
839 internal static ArgumentNullException ThrowHelperArgumentNull(string paramName, Message message)
841 return (ArgumentNullException)TraceUtility.ThrowHelperError(new ArgumentNullException(paramName), message);
844 internal static string CreateSourceString(object source)
846 return source.GetType().ToString() + "/" + source.GetHashCode().ToString(CultureInfo.CurrentCulture);
849 internal static void TraceHttpConnectionInformation(string localEndpoint, string remoteEndpoint, object source)
851 if (DiagnosticUtility.ShouldTraceInformation)
853 Dictionary<string, string> values = new Dictionary<string, string>(2)
855 { "LocalEndpoint", localEndpoint },
856 { "RemoteEndpoint", remoteEndpoint }
858 TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.ConnectToIPEndpoint,
859 SR.GetString(SR.TraceCodeConnectToIPEndpoint), new DictionaryTraceRecord(values), source, null);
863 internal static void TraceUserCodeException(Exception e, MethodInfo method)
865 if (DiagnosticUtility.ShouldTraceWarning)
867 StringTraceRecord record = new StringTraceRecord("Comment",
868 SR.GetString(SR.SFxUserCodeThrewException, method.DeclaringType.FullName, method.Name));
869 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning,
870 TraceCode.UnhandledExceptionInUserOperation, GenerateMsdnTraceCode(TraceCode.UnhandledExceptionInUserOperation),
871 SR.GetString(SR.TraceCodeUnhandledExceptionInUserOperation, method.DeclaringType.FullName, method.Name),
877 static TraceUtility()
879 //Maintain the order of calls
880 TraceUtility.SetEtwProviderId();
881 TraceUtility.SetEndToEndTracingFlags();
882 if (DiagnosticUtility.DiagnosticTrace != null)
884 DiagnosticTraceSource ts = (DiagnosticTraceSource)DiagnosticUtility.DiagnosticTrace.TraceSource;
885 TraceUtility.shouldPropagateActivity = (ts.PropagateActivity || TraceUtility.shouldPropagateActivityGlobal);
889 [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
890 Safe = "Doesn't leak config section instance, just reads and stores bool values.")]
891 [SecuritySafeCritical]
892 static void SetEndToEndTracingFlags()
894 EndToEndTracingElement element = DiagnosticSection.UnsafeGetSection().EndToEndTracing;
895 TraceUtility.shouldPropagateActivityGlobal = element.PropagateActivity;
896 // if Sys.Diag trace is not enabled then the value is true if shouldPropagateActivityGlobal is true
897 TraceUtility.shouldPropagateActivity = TraceUtility.shouldPropagateActivityGlobal || TraceUtility.shouldPropagateActivity;
899 //Activity tracing is enabled by either of the flags (Sys.Diag trace source or E2E config element)
900 DiagnosticUtility.ShouldUseActivity = (DiagnosticUtility.ShouldUseActivity || element.ActivityTracing);
901 TraceUtility.activityTracing = DiagnosticUtility.ShouldUseActivity;
903 TraceUtility.messageFlowTracing = element.MessageFlowTracing || TraceUtility.activityTracing;
904 TraceUtility.messageFlowTracingOnly = element.MessageFlowTracing && !element.ActivityTracing;
906 //Set the flag if activity tracing is enabled through the E2E config element as well
907 DiagnosticUtility.TracingEnabled = (DiagnosticUtility.TracingEnabled || TraceUtility.activityTracing);
910 static public long RetrieveMessageNumber()
912 return Interlocked.Increment(ref TraceUtility.messageNumber);
915 static public bool PropagateUserActivity
919 return TraceUtility.ShouldPropagateActivity &&
920 TraceUtility.PropagateUserActivityCore;
924 // Most of the time, shouldPropagateActivity will be false.
925 // This property will rarely be executed as a result.
926 static bool PropagateUserActivityCore
928 [MethodImpl(MethodImplOptions.NoInlining)]
931 return !(DiagnosticUtility.TracingEnabled) &&
932 DiagnosticTraceBase.ActivityId != Guid.Empty;
936 static internal string GetCallerInfo(OperationContext context)
938 if (context != null && context.IncomingMessageProperties != null)
940 object endpointMessageProperty;
941 if (context.IncomingMessageProperties.TryGetValue(RemoteEndpointMessageProperty.Name, out endpointMessageProperty))
943 RemoteEndpointMessageProperty endpoint = endpointMessageProperty as RemoteEndpointMessageProperty;
944 if (endpoint != null)
946 return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", endpoint.Address, endpoint.Port);
953 [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
954 Safe = "Doesn't leak config section instance, just reads and stores string values for Guid")]
955 [SecuritySafeCritical]
956 static internal void SetEtwProviderId()
958 // Get section should not trace as the ETW provider id is not set yet
959 DiagnosticSection diagnostics = DiagnosticSection.UnsafeGetSectionNoTrace();
960 Guid etwProviderId = Guid.Empty;
961 //set the Id in PT if specified in the config file. If not, ETW tracing is off.
962 if (PartialTrustHelpers.HasEtwPermissions() || diagnostics.IsEtwProviderIdFromConfigFile())
964 etwProviderId = Fx.CreateGuid(diagnostics.EtwProviderId);
966 System.Runtime.Diagnostics.EtwDiagnosticTrace.DefaultEtwProviderId = etwProviderId;
969 static internal void SetActivityId(MessageProperties properties)
972 if ((null != properties) && properties.TryGetValue(TraceUtility.E2EActivityId, out activityId))
974 DiagnosticTraceBase.ActivityId = activityId;
978 static internal bool ShouldPropagateActivity
980 get { return TraceUtility.shouldPropagateActivity; }
983 static internal bool ShouldPropagateActivityGlobal
985 get { return TraceUtility.shouldPropagateActivityGlobal; }
988 static internal bool ActivityTracing
990 get { return TraceUtility.activityTracing; }
993 static internal bool MessageFlowTracing
995 get { return TraceUtility.messageFlowTracing; }
998 static internal bool MessageFlowTracingOnly
1000 get { return TraceUtility.messageFlowTracingOnly; }
1003 static internal void MessageFlowAtMessageSent(Message message, EventTraceActivity eventTraceActivity)
1005 if (TraceUtility.MessageFlowTracing)
1009 bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
1011 if (TraceUtility.MessageFlowTracingOnly)
1013 if (activityIdFound && activityId != DiagnosticTraceBase.ActivityId)
1015 DiagnosticTraceBase.ActivityId = activityId;
1019 if (TD.MessageSentToTransportIsEnabled())
1021 TD.MessageSentToTransport(eventTraceActivity, correlationId);
1026 static internal void MessageFlowAtMessageReceived(Message message, OperationContext context, EventTraceActivity eventTraceActivity, bool createNewActivityId)
1028 if (TraceUtility.MessageFlowTracing)
1032 bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
1033 if (TraceUtility.MessageFlowTracingOnly)
1035 if (createNewActivityId)
1037 if (!activityIdFound)
1039 activityId = Guid.NewGuid();
1040 activityIdFound = true;
1042 //message flow tracing only - start fresh
1043 DiagnosticTraceBase.ActivityId = Guid.Empty;
1046 if (activityIdFound)
1048 FxTrace.Trace.SetAndTraceTransfer(activityId, !createNewActivityId);
1049 message.Properties[TraceUtility.E2EActivityId] = Trace.CorrelationManager.ActivityId;
1052 if (TD.MessageReceivedFromTransportIsEnabled())
1054 if (context == null)
1056 context = OperationContext.Current;
1059 TD.MessageReceivedFromTransport(eventTraceActivity, correlationId, TraceUtility.GetAnnotation(context));
1064 internal static string GetAnnotation(OperationContext context)
1066 object hostReference;
1067 if (context != null && null != context.IncomingMessage && (MessageState.Closed != context.IncomingMessage.State))
1069 if (!context.IncomingMessageProperties.TryGetValue(TraceApplicationReference, out hostReference))
1071 hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(context.Host);
1072 context.IncomingMessageProperties.Add(TraceApplicationReference, hostReference);
1077 hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(null);
1079 return (string)hostReference;
1082 internal static void TransferFromTransport(Message message)
1084 if (message != null && DiagnosticUtility.ShouldUseActivity)
1086 Guid guid = Guid.Empty;
1088 // Only look if we are allowing user propagation
1089 if (TraceUtility.ShouldPropagateActivity)
1091 guid = ActivityIdHeader.ExtractActivityId(message);
1094 if (guid == Guid.Empty)
1096 guid = Guid.NewGuid();
1099 ServiceModelActivity activity = null;
1100 bool emitStart = true;
1101 if (ServiceModelActivity.Current != null)
1103 if ((ServiceModelActivity.Current.Id == guid) ||
1104 (ServiceModelActivity.Current.ActivityType == ActivityType.ProcessAction))
1106 activity = ServiceModelActivity.Current;
1109 else if (ServiceModelActivity.Current.PreviousActivity != null &&
1110 ServiceModelActivity.Current.PreviousActivity.Id == guid)
1112 activity = ServiceModelActivity.Current.PreviousActivity;
1117 if (activity == null)
1119 activity = ServiceModelActivity.CreateActivity(guid);
1121 if (DiagnosticUtility.ShouldUseActivity)
1125 if (null != FxTrace.Trace)
1127 FxTrace.Trace.TraceTransfer(guid);
1129 ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityProcessAction, message.Headers.Action), ActivityType.ProcessAction);
1132 message.Properties[TraceUtility.ActivityIdKey] = activity;
1136 static internal void UpdateAsyncOperationContextWithActivity(object activity)
1138 if (OperationContext.Current != null && activity != null)
1140 OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationActivityKey] = activity;
1144 static internal object ExtractAsyncOperationContextActivity()
1147 if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue(TraceUtility.AsyncOperationActivityKey, out data))
1149 OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationActivityKey);
1154 static internal void UpdateAsyncOperationContextWithStartTime(EventTraceActivity eventTraceActivity, long startTime)
1156 if (OperationContext.Current != null)
1158 OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationStartTimeKey] = new EventTraceActivityTimeProperty(eventTraceActivity, startTime);
1162 static internal void ExtractAsyncOperationStartTime(out EventTraceActivity eventTraceActivity, out long startTime)
1164 EventTraceActivityTimeProperty data = null;
1165 eventTraceActivity = null;
1167 if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue<EventTraceActivityTimeProperty>(TraceUtility.AsyncOperationStartTimeKey, out data))
1169 OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationStartTimeKey);
1170 eventTraceActivity = data.EventTraceActivity;
1171 startTime = data.StartTime;
1175 internal class TracingAsyncCallbackState
1180 internal TracingAsyncCallbackState(object innerState)
1182 this.innerState = innerState;
1183 this.activityId = DiagnosticTraceBase.ActivityId;
1186 internal object InnerState
1188 get { return this.innerState; }
1191 internal Guid ActivityId
1193 get { return this.activityId; }
1197 internal static AsyncCallback WrapExecuteUserCodeAsyncCallback(AsyncCallback callback)
1199 return (DiagnosticUtility.ShouldUseActivity && callback != null) ?
1200 (new ExecuteUserCodeAsync(callback)).Callback
1204 sealed class ExecuteUserCodeAsync
1206 AsyncCallback callback;
1208 public ExecuteUserCodeAsync(AsyncCallback callback)
1210 this.callback = callback;
1213 public AsyncCallback Callback
1217 return Fx.ThunkCallback(new AsyncCallback(this.ExecuteUserCode));
1221 void ExecuteUserCode(IAsyncResult result)
1223 using (ServiceModelActivity activity = ServiceModelActivity.CreateBoundedActivity())
1225 ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityCallback), ActivityType.ExecuteUserCode);
1226 this.callback(result);
1232 class EventTraceActivityTimeProperty
1235 EventTraceActivity eventTraceActivity;
1237 public EventTraceActivityTimeProperty(EventTraceActivity eventTraceActivity, long startTime)
1239 this.eventTraceActivity = eventTraceActivity;
1240 this.startTime = startTime;
1243 internal long StartTime
1245 get { return this.startTime; }
1247 internal EventTraceActivity EventTraceActivity
1249 get { return this.eventTraceActivity; }
1254 internal static string GetRemoteEndpointAddressPort(Net.IPEndPoint iPEndPoint)
1256 //We really don't want any exceptions out of TraceUtility.
1257 if (iPEndPoint != null)
1261 return iPEndPoint.Address.ToString() + ":" + iPEndPoint.Port;
1263 catch (Exception exception)
1265 if (Fx.IsFatal(exception))
1269 //ignore and continue with all non-fatal exceptions.
1273 return string.Empty;
1276 internal static string GetRemoteEndpointAddressPort(RemoteEndpointMessageProperty remoteEndpointMessageProperty)
1280 if (remoteEndpointMessageProperty != null)
1282 return remoteEndpointMessageProperty.Address + ":" + remoteEndpointMessageProperty.Port;
1285 catch (Exception exception)
1287 if (Fx.IsFatal(exception))
1291 //ignore and continue with all non-fatal exceptions.
1294 return string.Empty;