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;
558 internal static ServiceModelActivity ExtractActivity(RequestContext request)
562 return TraceUtility.ExtractActivity(request.RequestMessage);
575 internal static Guid ExtractActivityId(Message message)
577 if (TraceUtility.MessageFlowTracingOnly)
579 return ActivityIdHeader.ExtractActivityId(message);
582 ServiceModelActivity activity = ExtractActivity(message);
583 return activity == null ? Guid.Empty : activity.Id;
586 internal static Guid GetReceivedActivityId(OperationContext operationContext)
588 object activityIdFromProprties;
589 if (!operationContext.IncomingMessageProperties.TryGetValue(E2EActivityId, out activityIdFromProprties))
591 return TraceUtility.ExtractActivityId(operationContext.IncomingMessage);
595 return (Guid)activityIdFromProprties;
599 internal static ServiceModelActivity ExtractAndRemoveActivity(Message message)
601 ServiceModelActivity retval = TraceUtility.ExtractActivity(message);
604 // If the property is just removed, the item is disposed and we don't want the thing
605 // to be disposed of.
606 message.Properties[TraceUtility.ActivityIdKey] = false;
611 internal static void ProcessIncomingMessage(Message message, EventTraceActivity eventTraceActivity)
613 ServiceModelActivity activity = ServiceModelActivity.Current;
614 if (activity != null && DiagnosticUtility.ShouldUseActivity)
616 ServiceModelActivity incomingActivity = TraceUtility.ExtractActivity(message);
617 if (null != incomingActivity && incomingActivity.Id != activity.Id)
619 using (ServiceModelActivity.BoundOperation(incomingActivity))
621 if (null != FxTrace.Trace)
623 FxTrace.Trace.TraceTransfer(activity.Id);
627 TraceUtility.SetActivity(message, activity);
630 TraceUtility.MessageFlowAtMessageReceived(message, null, eventTraceActivity, true);
632 if (MessageLogger.LogMessagesAtServiceLevel)
634 MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelReceiveReply | MessageLoggingSource.LastChance);
638 internal static void ProcessOutgoingMessage(Message message, EventTraceActivity eventTraceActivity)
640 ServiceModelActivity activity = ServiceModelActivity.Current;
641 if (DiagnosticUtility.ShouldUseActivity)
643 TraceUtility.SetActivity(message, activity);
645 if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity)
647 TraceUtility.AddAmbientActivityToMessage(message);
650 TraceUtility.MessageFlowAtMessageSent(message, eventTraceActivity);
652 if (MessageLogger.LogMessagesAtServiceLevel)
654 MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelSendRequest | MessageLoggingSource.LastChance);
658 internal static void SetActivity(Message message, ServiceModelActivity activity)
660 if (DiagnosticUtility.ShouldUseActivity && message != null && message.State != MessageState.Closed)
662 message.Properties[TraceUtility.ActivityIdKey] = activity;
666 internal static void TraceDroppedMessage(Message message, EndpointDispatcher dispatcher)
668 if (DiagnosticUtility.ShouldTraceInformation)
670 EndpointAddress endpointAddress = null;
671 if (dispatcher != null)
673 endpointAddress = dispatcher.EndpointAddress;
675 TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.DroppedAMessage,
676 SR.GetString(SR.TraceCodeDroppedAMessage), new MessageDroppedTraceRecord(message, endpointAddress));
680 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription)
682 TraceEvent(severity, traceCode, traceDescription, null, traceDescription, (Exception)null);
685 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData)
687 TraceEvent(severity, traceCode, traceDescription, extendedData, null, (Exception)null);
690 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source)
692 TraceEvent(severity, traceCode, traceDescription, null, source, (Exception)null);
695 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Exception exception)
697 TraceEvent(severity, traceCode, traceDescription, null, source, exception);
700 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Message message)
704 TraceEvent(severity, traceCode, traceDescription, null, (Exception)null);
708 TraceEvent(severity, traceCode, traceDescription, message, message);
712 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Message message)
714 Guid activityId = TraceUtility.ExtractActivityId(message);
715 if (DiagnosticUtility.ShouldTrace(severity))
717 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), null, activityId, message);
721 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Exception exception, Message message)
723 Guid activityId = TraceUtility.ExtractActivityId(message);
724 if (DiagnosticUtility.ShouldTrace(severity))
726 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), exception, activityId, null);
730 internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
732 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
735 // These methods require a TraceRecord to be allocated, so we want them to show up on profiles if the caller didn't avoid
736 // allocating the TraceRecord by using ShouldTrace.
737 [MethodImpl(MethodImplOptions.NoInlining)]
738 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
740 if (DiagnosticUtility.ShouldTrace(severity))
742 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
746 [MethodImpl(MethodImplOptions.NoInlining)]
747 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Message message)
749 Guid activityId = TraceUtility.ExtractActivityId(message);
750 if (DiagnosticUtility.ShouldTrace(severity))
752 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
753 traceDescription, extendedData, exception, activityId, source);
757 internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
759 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
760 traceDescription, extendedData, exception, activityId, source);
763 [MethodImpl(MethodImplOptions.NoInlining)]
764 internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
766 if (DiagnosticUtility.ShouldTrace(severity))
768 DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
769 traceDescription, extendedData, exception, activityId, source);
773 static string GenerateMsdnTraceCode(int traceCode)
775 int group = (int)(traceCode & 0xFFFF0000);
776 string terminatorUri = null;
779 case TraceCode.Administration:
780 terminatorUri = "System.ServiceModel.Administration";
782 case TraceCode.Channels:
783 terminatorUri = "System.ServiceModel.Channels";
785 case TraceCode.ComIntegration:
786 terminatorUri = "System.ServiceModel.ComIntegration";
788 case TraceCode.Diagnostics:
789 terminatorUri = "System.ServiceModel.Diagnostics";
791 case TraceCode.PortSharing:
792 terminatorUri = "System.ServiceModel.PortSharing";
794 case TraceCode.Security:
795 terminatorUri = "System.ServiceModel.Security";
797 case TraceCode.Serialization:
798 terminatorUri = "System.Runtime.Serialization";
800 case TraceCode.ServiceModel:
801 case TraceCode.ServiceModelTransaction:
802 terminatorUri = "System.ServiceModel";
805 terminatorUri = string.Empty;
809 Fx.Assert(traceCodes.ContainsKey(traceCode),
810 string.Format(CultureInfo.InvariantCulture, "Unsupported trace code: Please add trace code 0x{0} to the SortedList TraceUtility.traceCodes in {1}",
811 traceCode.ToString("X", CultureInfo.InvariantCulture), typeof(TraceUtility)));
813 return LegacyDiagnosticTrace.GenerateMsdnTraceCode(terminatorUri, traceCodes[traceCode]);
819 internal static Exception ThrowHelperError(Exception exception, Message message)
821 // If the message is closed, we won't get an activity
822 Guid activityId = TraceUtility.ExtractActivityId(message);
823 if (DiagnosticUtility.ShouldTraceError)
825 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
826 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
831 internal static Exception ThrowHelperError(Exception exception, Guid activityId, object source)
833 if (DiagnosticUtility.ShouldTraceError)
835 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
836 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, source);
841 internal static Exception ThrowHelperWarning(Exception exception, Message message)
843 if (DiagnosticUtility.ShouldTraceWarning)
845 Guid activityId = TraceUtility.ExtractActivityId(message);
846 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
847 TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
852 internal static ArgumentException ThrowHelperArgument(string paramName, string message, Message msg)
854 return (ArgumentException)TraceUtility.ThrowHelperError(new ArgumentException(message, paramName), msg);
857 internal static ArgumentNullException ThrowHelperArgumentNull(string paramName, Message message)
859 return (ArgumentNullException)TraceUtility.ThrowHelperError(new ArgumentNullException(paramName), message);
862 internal static string CreateSourceString(object source)
864 return source.GetType().ToString() + "/" + source.GetHashCode().ToString(CultureInfo.CurrentCulture);
867 internal static void TraceHttpConnectionInformation(string localEndpoint, string remoteEndpoint, object source)
869 if (DiagnosticUtility.ShouldTraceInformation)
871 Dictionary<string, string> values = new Dictionary<string, string>(2)
873 { "LocalEndpoint", localEndpoint },
874 { "RemoteEndpoint", remoteEndpoint }
876 TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.ConnectToIPEndpoint,
877 SR.GetString(SR.TraceCodeConnectToIPEndpoint), new DictionaryTraceRecord(values), source, null);
881 internal static void TraceUserCodeException(Exception e, MethodInfo method)
883 if (DiagnosticUtility.ShouldTraceWarning)
885 StringTraceRecord record = new StringTraceRecord("Comment",
886 SR.GetString(SR.SFxUserCodeThrewException, method.DeclaringType.FullName, method.Name));
887 DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning,
888 TraceCode.UnhandledExceptionInUserOperation, GenerateMsdnTraceCode(TraceCode.UnhandledExceptionInUserOperation),
889 SR.GetString(SR.TraceCodeUnhandledExceptionInUserOperation, method.DeclaringType.FullName, method.Name),
895 static TraceUtility()
897 //Maintain the order of calls
898 TraceUtility.SetEtwProviderId();
899 TraceUtility.SetEndToEndTracingFlags();
900 if (DiagnosticUtility.DiagnosticTrace != null)
902 DiagnosticTraceSource ts = (DiagnosticTraceSource)DiagnosticUtility.DiagnosticTrace.TraceSource;
903 TraceUtility.shouldPropagateActivity = (ts.PropagateActivity || TraceUtility.shouldPropagateActivityGlobal);
907 [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
908 Safe = "Doesn't leak config section instance, just reads and stores bool values.")]
909 [SecuritySafeCritical]
910 static void SetEndToEndTracingFlags()
912 EndToEndTracingElement element = DiagnosticSection.UnsafeGetSection().EndToEndTracing;
913 TraceUtility.shouldPropagateActivityGlobal = element.PropagateActivity;
914 // if Sys.Diag trace is not enabled then the value is true if shouldPropagateActivityGlobal is true
915 TraceUtility.shouldPropagateActivity = TraceUtility.shouldPropagateActivityGlobal || TraceUtility.shouldPropagateActivity;
917 //Activity tracing is enabled by either of the flags (Sys.Diag trace source or E2E config element)
918 DiagnosticUtility.ShouldUseActivity = (DiagnosticUtility.ShouldUseActivity || element.ActivityTracing);
919 TraceUtility.activityTracing = DiagnosticUtility.ShouldUseActivity;
921 TraceUtility.messageFlowTracing = element.MessageFlowTracing || TraceUtility.activityTracing;
922 TraceUtility.messageFlowTracingOnly = element.MessageFlowTracing && !element.ActivityTracing;
924 //Set the flag if activity tracing is enabled through the E2E config element as well
925 DiagnosticUtility.TracingEnabled = (DiagnosticUtility.TracingEnabled || TraceUtility.activityTracing);
928 static public long RetrieveMessageNumber()
930 return Interlocked.Increment(ref TraceUtility.messageNumber);
933 static public bool PropagateUserActivity
937 return TraceUtility.ShouldPropagateActivity &&
938 TraceUtility.PropagateUserActivityCore;
942 // Most of the time, shouldPropagateActivity will be false.
943 // This property will rarely be executed as a result.
944 static bool PropagateUserActivityCore
946 [MethodImpl(MethodImplOptions.NoInlining)]
949 return !(DiagnosticUtility.TracingEnabled) &&
950 DiagnosticTraceBase.ActivityId != Guid.Empty;
954 static internal string GetCallerInfo(OperationContext context)
956 if (context != null && context.IncomingMessageProperties != null)
958 object endpointMessageProperty;
959 if (context.IncomingMessageProperties.TryGetValue(RemoteEndpointMessageProperty.Name, out endpointMessageProperty))
961 RemoteEndpointMessageProperty endpoint = endpointMessageProperty as RemoteEndpointMessageProperty;
962 if (endpoint != null)
964 return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", endpoint.Address, endpoint.Port);
971 [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
972 Safe = "Doesn't leak config section instance, just reads and stores string values for Guid")]
973 [SecuritySafeCritical]
974 static internal void SetEtwProviderId()
976 // Get section should not trace as the ETW provider id is not set yet
977 DiagnosticSection diagnostics = DiagnosticSection.UnsafeGetSectionNoTrace();
978 Guid etwProviderId = Guid.Empty;
979 //set the Id in PT if specified in the config file. If not, ETW tracing is off.
980 if (PartialTrustHelpers.HasEtwPermissions() || diagnostics.IsEtwProviderIdFromConfigFile())
982 etwProviderId = Fx.CreateGuid(diagnostics.EtwProviderId);
984 System.Runtime.Diagnostics.EtwDiagnosticTrace.DefaultEtwProviderId = etwProviderId;
987 static internal void SetActivityId(MessageProperties properties)
990 if ((null != properties) && properties.TryGetValue(TraceUtility.E2EActivityId, out activityId))
992 DiagnosticTraceBase.ActivityId = activityId;
996 static internal bool ShouldPropagateActivity
998 get { return TraceUtility.shouldPropagateActivity; }
1001 static internal bool ShouldPropagateActivityGlobal
1003 get { return TraceUtility.shouldPropagateActivityGlobal; }
1006 static internal bool ActivityTracing
1008 get { return TraceUtility.activityTracing; }
1011 static internal bool MessageFlowTracing
1013 get { return TraceUtility.messageFlowTracing; }
1016 static internal bool MessageFlowTracingOnly
1018 get { return TraceUtility.messageFlowTracingOnly; }
1021 static internal void MessageFlowAtMessageSent(Message message, EventTraceActivity eventTraceActivity)
1023 if (TraceUtility.MessageFlowTracing)
1027 bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
1029 if (TraceUtility.MessageFlowTracingOnly)
1031 if (activityIdFound && activityId != DiagnosticTraceBase.ActivityId)
1033 DiagnosticTraceBase.ActivityId = activityId;
1037 if (TD.MessageSentToTransportIsEnabled())
1039 TD.MessageSentToTransport(eventTraceActivity, correlationId);
1044 static internal void MessageFlowAtMessageReceived(Message message, OperationContext context, EventTraceActivity eventTraceActivity, bool createNewActivityId)
1046 if (TraceUtility.MessageFlowTracing)
1050 bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
1051 if (TraceUtility.MessageFlowTracingOnly)
1053 if (createNewActivityId)
1055 if (!activityIdFound)
1057 activityId = Guid.NewGuid();
1058 activityIdFound = true;
1060 //message flow tracing only - start fresh
1061 DiagnosticTraceBase.ActivityId = Guid.Empty;
1064 if (activityIdFound)
1066 FxTrace.Trace.SetAndTraceTransfer(activityId, !createNewActivityId);
1067 message.Properties[TraceUtility.E2EActivityId] = Trace.CorrelationManager.ActivityId;
1070 if (TD.MessageReceivedFromTransportIsEnabled())
1072 if (context == null)
1074 context = OperationContext.Current;
1077 TD.MessageReceivedFromTransport(eventTraceActivity, correlationId, TraceUtility.GetAnnotation(context));
1082 internal static string GetAnnotation(OperationContext context)
1084 object hostReference;
1085 if (context != null && null != context.IncomingMessage && (MessageState.Closed != context.IncomingMessage.State))
1087 if (!context.IncomingMessageProperties.TryGetValue(TraceApplicationReference, out hostReference))
1089 hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(context.Host);
1090 context.IncomingMessageProperties.Add(TraceApplicationReference, hostReference);
1095 hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(null);
1097 return (string)hostReference;
1100 internal static void TransferFromTransport(Message message)
1102 if (message != null && DiagnosticUtility.ShouldUseActivity)
1104 Guid guid = Guid.Empty;
1106 // Only look if we are allowing user propagation
1107 if (TraceUtility.ShouldPropagateActivity)
1109 guid = ActivityIdHeader.ExtractActivityId(message);
1112 if (guid == Guid.Empty)
1114 guid = Guid.NewGuid();
1117 ServiceModelActivity activity = null;
1118 bool emitStart = true;
1119 if (ServiceModelActivity.Current != null)
1121 if ((ServiceModelActivity.Current.Id == guid) ||
1122 (ServiceModelActivity.Current.ActivityType == ActivityType.ProcessAction))
1124 activity = ServiceModelActivity.Current;
1127 else if (ServiceModelActivity.Current.PreviousActivity != null &&
1128 ServiceModelActivity.Current.PreviousActivity.Id == guid)
1130 activity = ServiceModelActivity.Current.PreviousActivity;
1135 if (activity == null)
1137 activity = ServiceModelActivity.CreateActivity(guid);
1139 if (DiagnosticUtility.ShouldUseActivity)
1143 if (null != FxTrace.Trace)
1145 FxTrace.Trace.TraceTransfer(guid);
1147 ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityProcessAction, message.Headers.Action), ActivityType.ProcessAction);
1150 message.Properties[TraceUtility.ActivityIdKey] = activity;
1154 static internal void UpdateAsyncOperationContextWithActivity(object activity)
1156 if (OperationContext.Current != null && activity != null)
1158 OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationActivityKey] = activity;
1162 static internal object ExtractAsyncOperationContextActivity()
1165 if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue(TraceUtility.AsyncOperationActivityKey, out data))
1167 OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationActivityKey);
1172 static internal void UpdateAsyncOperationContextWithStartTime(EventTraceActivity eventTraceActivity, long startTime)
1174 if (OperationContext.Current != null)
1176 OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationStartTimeKey] = new EventTraceActivityTimeProperty(eventTraceActivity, startTime);
1180 static internal void ExtractAsyncOperationStartTime(out EventTraceActivity eventTraceActivity, out long startTime)
1182 EventTraceActivityTimeProperty data = null;
1183 eventTraceActivity = null;
1185 if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue<EventTraceActivityTimeProperty>(TraceUtility.AsyncOperationStartTimeKey, out data))
1187 OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationStartTimeKey);
1188 eventTraceActivity = data.EventTraceActivity;
1189 startTime = data.StartTime;
1193 internal class TracingAsyncCallbackState
1198 internal TracingAsyncCallbackState(object innerState)
1200 this.innerState = innerState;
1201 this.activityId = DiagnosticTraceBase.ActivityId;
1204 internal object InnerState
1206 get { return this.innerState; }
1209 internal Guid ActivityId
1211 get { return this.activityId; }
1215 internal static AsyncCallback WrapExecuteUserCodeAsyncCallback(AsyncCallback callback)
1217 return (DiagnosticUtility.ShouldUseActivity && callback != null) ?
1218 (new ExecuteUserCodeAsync(callback)).Callback
1222 sealed class ExecuteUserCodeAsync
1224 AsyncCallback callback;
1226 public ExecuteUserCodeAsync(AsyncCallback callback)
1228 this.callback = callback;
1231 public AsyncCallback Callback
1235 return Fx.ThunkCallback(new AsyncCallback(this.ExecuteUserCode));
1239 void ExecuteUserCode(IAsyncResult result)
1241 using (ServiceModelActivity activity = ServiceModelActivity.CreateBoundedActivity())
1243 ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityCallback), ActivityType.ExecuteUserCode);
1244 this.callback(result);
1250 class EventTraceActivityTimeProperty
1253 EventTraceActivity eventTraceActivity;
1255 public EventTraceActivityTimeProperty(EventTraceActivity eventTraceActivity, long startTime)
1257 this.eventTraceActivity = eventTraceActivity;
1258 this.startTime = startTime;
1261 internal long StartTime
1263 get { return this.startTime; }
1265 internal EventTraceActivity EventTraceActivity
1267 get { return this.eventTraceActivity; }
1272 internal static string GetRemoteEndpointAddressPort(Net.IPEndPoint iPEndPoint)
1274 //We really don't want any exceptions out of TraceUtility.
1275 if (iPEndPoint != null)
1279 return iPEndPoint.Address.ToString() + ":" + iPEndPoint.Port;
1281 catch (Exception exception)
1283 if (Fx.IsFatal(exception))
1287 //ignore and continue with all non-fatal exceptions.
1291 return string.Empty;
1294 internal static string GetRemoteEndpointAddressPort(RemoteEndpointMessageProperty remoteEndpointMessageProperty)
1298 if (remoteEndpointMessageProperty != null)
1300 return remoteEndpointMessageProperty.Address + ":" + remoteEndpointMessageProperty.Port;
1303 catch (Exception exception)
1305 if (Fx.IsFatal(exception))
1309 //ignore and continue with all non-fatal exceptions.
1312 return string.Empty;