536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
1316 lines
71 KiB
C#
1316 lines
71 KiB
C#
//----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//----------------------------------------------------------------------------
|
|
namespace System.ServiceModel.Diagnostics
|
|
{
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
using System.Runtime;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.Diagnostics;
|
|
using System.ServiceModel.Channels;
|
|
using System.ServiceModel.Dispatcher;
|
|
using System.Threading;
|
|
using System.Security;
|
|
using System.ServiceModel.Configuration;
|
|
using System.ServiceModel.Activation;
|
|
using System.Xml;
|
|
using System.ServiceModel.Diagnostics.Application;
|
|
using System.Globalization;
|
|
using System.Collections.Generic;
|
|
|
|
static class TraceUtility
|
|
{
|
|
const string ActivityIdKey = "ActivityId";
|
|
const string AsyncOperationActivityKey = "AsyncOperationActivity";
|
|
const string AsyncOperationStartTimeKey = "AsyncOperationStartTime";
|
|
static bool shouldPropagateActivity;
|
|
static bool shouldPropagateActivityGlobal;
|
|
static bool activityTracing;
|
|
static bool messageFlowTracing;
|
|
static bool messageFlowTracingOnly;
|
|
static long messageNumber = 0;
|
|
static Func<Action<AsyncCallback, IAsyncResult>> asyncCallbackGenerator;
|
|
static SortedList<int, string> traceCodes = new SortedList<int, string>(382)
|
|
{
|
|
// Administration trace codes (TraceCode.Administration)
|
|
{ TraceCode.WmiPut, "WmiPut" },
|
|
|
|
// Diagnostic trace codes (TraceCode.Diagnostics)
|
|
{ TraceCode.AppDomainUnload, "AppDomainUnload" },
|
|
{ TraceCode.EventLog, "EventLog" },
|
|
{ TraceCode.ThrowingException, "ThrowingException" },
|
|
{ TraceCode.TraceHandledException, "TraceHandledException" },
|
|
{ TraceCode.UnhandledException, "UnhandledException" },
|
|
{ TraceCode.FailedToAddAnActivityIdHeader, "FailedToAddAnActivityIdHeader" },
|
|
{ TraceCode.FailedToReadAnActivityIdHeader, "FailedToReadAnActivityIdHeader" },
|
|
{ TraceCode.FilterNotMatchedNodeQuotaExceeded, "FilterNotMatchedNodeQuotaExceeded" },
|
|
{ TraceCode.MessageCountLimitExceeded, "MessageCountLimitExceeded" },
|
|
{ TraceCode.DiagnosticsFailedMessageTrace, "DiagnosticsFailedMessageTrace" },
|
|
{ TraceCode.MessageNotLoggedQuotaExceeded, "MessageNotLoggedQuotaExceeded" },
|
|
{ TraceCode.TraceTruncatedQuotaExceeded, "TraceTruncatedQuotaExceeded" },
|
|
{ TraceCode.ActivityBoundary, "ActivityBoundary" },
|
|
|
|
// Serialization trace codes (TraceCode.Serialization)
|
|
{ TraceCode.ElementIgnored, "" }, // shared by ServiceModel, need to investigate if should put this one in the SM section
|
|
|
|
// Channels trace codes (TraceCode.Channels)
|
|
{ TraceCode.ConnectionAbandoned, "ConnectionAbandoned" },
|
|
{ TraceCode.ConnectionPoolCloseException, "ConnectionPoolCloseException" },
|
|
{ TraceCode.ConnectionPoolIdleTimeoutReached, "ConnectionPoolIdleTimeoutReached" },
|
|
{ TraceCode.ConnectionPoolLeaseTimeoutReached, "ConnectionPoolLeaseTimeoutReached" },
|
|
{ TraceCode.ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached, "ConnectionPoolMaxOutboundConnectionsPerEndpointQuotaReached" },
|
|
{ TraceCode.ServerMaxPooledConnectionsQuotaReached, "ServerMaxPooledConnectionsQuotaReached" },
|
|
{ TraceCode.EndpointListenerClose, "EndpointListenerClose" },
|
|
{ TraceCode.EndpointListenerOpen, "EndpointListenerOpen" },
|
|
{ TraceCode.HttpResponseReceived, "HttpResponseReceived" },
|
|
{ TraceCode.HttpChannelConcurrentReceiveQuotaReached, "HttpChannelConcurrentReceiveQuotaReached" },
|
|
{ TraceCode.HttpChannelMessageReceiveFailed, "HttpChannelMessageReceiveFailed" },
|
|
{ TraceCode.HttpChannelUnexpectedResponse, "HttpChannelUnexpectedResponse" },
|
|
{ TraceCode.HttpChannelRequestAborted, "HttpChannelRequestAborted" },
|
|
{ TraceCode.HttpChannelResponseAborted, "HttpChannelResponseAborted" },
|
|
{ TraceCode.HttpsClientCertificateInvalid, "HttpsClientCertificateInvalid" },
|
|
{ TraceCode.HttpsClientCertificateNotPresent, "HttpsClientCertificateNotPresent" },
|
|
{ TraceCode.NamedPipeChannelMessageReceiveFailed, "NamedPipeChannelMessageReceiveFailed" },
|
|
{ TraceCode.NamedPipeChannelMessageReceived, "NamedPipeChannelMessageReceived" },
|
|
{ TraceCode.MessageReceived, "MessageReceived" },
|
|
{ TraceCode.MessageSent, "MessageSent" },
|
|
{ TraceCode.RequestChannelReplyReceived, "RequestChannelReplyReceived" },
|
|
{ TraceCode.TcpChannelMessageReceiveFailed, "TcpChannelMessageReceiveFailed" },
|
|
{ TraceCode.TcpChannelMessageReceived, "TcpChannelMessageReceived" },
|
|
{ TraceCode.ConnectToIPEndpoint, "ConnectToIPEndpoint" },
|
|
{ TraceCode.SocketConnectionCreate, "SocketConnectionCreate" },
|
|
{ TraceCode.SocketConnectionClose, "SocketConnectionClose" },
|
|
{ TraceCode.SocketConnectionAbort, "SocketConnectionAbort" },
|
|
{ TraceCode.SocketConnectionAbortClose, "SocketConnectionAbortClose" },
|
|
{ TraceCode.PipeConnectionAbort, "PipeConnectionAbort" },
|
|
{ TraceCode.RequestContextAbort, "RequestContextAbort" },
|
|
{ TraceCode.ChannelCreated, "ChannelCreated" },
|
|
{ TraceCode.ChannelDisposed, "ChannelDisposed" },
|
|
{ TraceCode.ListenerCreated, "ListenerCreated" },
|
|
{ TraceCode.ListenerDisposed, "ListenerDisposed" },
|
|
{ TraceCode.PrematureDatagramEof, "PrematureDatagramEof" },
|
|
{ TraceCode.MaxPendingConnectionsReached, "MaxPendingConnectionsReached" },
|
|
{ TraceCode.MaxAcceptedChannelsReached, "MaxAcceptedChannelsReached" },
|
|
{ TraceCode.ChannelConnectionDropped, "ChannelConnectionDropped" },
|
|
{ TraceCode.HttpAuthFailed, "HttpAuthFailed" },
|
|
{ TraceCode.NoExistingTransportManager, "NoExistingTransportManager" },
|
|
{ TraceCode.IncompatibleExistingTransportManager, "IncompatibleExistingTransportManager" },
|
|
{ TraceCode.InitiatingNamedPipeConnection, "InitiatingNamedPipeConnection" },
|
|
{ TraceCode.InitiatingTcpConnection, "InitiatingTcpConnection" },
|
|
{ TraceCode.OpenedListener, "OpenedListener" },
|
|
{ TraceCode.SslClientCertMissing, "SslClientCertMissing" },
|
|
{ TraceCode.StreamSecurityUpgradeAccepted, "StreamSecurityUpgradeAccepted" },
|
|
{ TraceCode.TcpConnectError, "TcpConnectError" },
|
|
{ TraceCode.FailedAcceptFromPool, "FailedAcceptFromPool" },
|
|
{ TraceCode.FailedPipeConnect, "FailedPipeConnect" },
|
|
{ TraceCode.SystemTimeResolution, "SystemTimeResolution" },
|
|
{ TraceCode.PeerNeighborCloseFailed, "PeerNeighborCloseFailed" },
|
|
{ TraceCode.PeerNeighborClosingFailed, "PeerNeighborClosingFailed" },
|
|
{ TraceCode.PeerNeighborNotAccepted, "PeerNeighborNotAccepted" },
|
|
{ TraceCode.PeerNeighborNotFound, "PeerNeighborNotFound" },
|
|
{ TraceCode.PeerNeighborOpenFailed, "PeerNeighborOpenFailed" },
|
|
{ TraceCode.PeerNeighborStateChanged, "PeerNeighborStateChanged" },
|
|
{ TraceCode.PeerNeighborStateChangeFailed, "PeerNeighborStateChangeFailed" },
|
|
{ TraceCode.PeerNeighborMessageReceived, "PeerNeighborMessageReceived" },
|
|
{ TraceCode.PeerNeighborManagerOffline, "PeerNeighborManagerOffline" },
|
|
{ TraceCode.PeerNeighborManagerOnline, "PeerNeighborManagerOnline" },
|
|
{ TraceCode.PeerChannelMessageReceived, "PeerChannelMessageReceived" },
|
|
{ TraceCode.PeerChannelMessageSent, "PeerChannelMessageSent" },
|
|
{ TraceCode.PeerNodeAddressChanged, "PeerNodeAddressChanged" },
|
|
{ TraceCode.PeerNodeOpening, "PeerNodeOpening" },
|
|
{ TraceCode.PeerNodeOpened, "PeerNodeOpened" },
|
|
{ TraceCode.PeerNodeOpenFailed, "PeerNodeOpenFailed" },
|
|
{ TraceCode.PeerNodeClosing, "PeerNodeClosing" },
|
|
{ TraceCode.PeerNodeClosed, "PeerNodeClosed" },
|
|
{ TraceCode.PeerFloodedMessageReceived, "PeerFloodedMessageReceived" },
|
|
{ TraceCode.PeerFloodedMessageNotPropagated, "PeerFloodedMessageNotPropagated" },
|
|
{ TraceCode.PeerFloodedMessageNotMatched, "PeerFloodedMessageNotMatched" },
|
|
{ TraceCode.PnrpRegisteredAddresses, "PnrpRegisteredAddresses" },
|
|
{ TraceCode.PnrpUnregisteredAddresses, "PnrpUnregisteredAddresses" },
|
|
{ TraceCode.PnrpResolvedAddresses, "PnrpResolvedAddresses" },
|
|
{ TraceCode.PnrpResolveException, "PnrpResolveException" },
|
|
{ TraceCode.PeerReceiveMessageAuthenticationFailure, "PeerReceiveMessageAuthenticationFailure" },
|
|
{ TraceCode.PeerNodeAuthenticationFailure, "PeerNodeAuthenticationFailure" },
|
|
{ TraceCode.PeerNodeAuthenticationTimeout, "PeerNodeAuthenticationTimeout" },
|
|
{ TraceCode.PeerFlooderReceiveMessageQuotaExceeded, "PeerFlooderReceiveMessageQuotaExceeded" },
|
|
{ TraceCode.PeerServiceOpened, "PeerServiceOpened" },
|
|
{ TraceCode.PeerMaintainerActivity, "PeerMaintainerActivity" },
|
|
{ TraceCode.MsmqCannotPeekOnQueue, "MsmqCannotPeekOnQueue" },
|
|
{ TraceCode.MsmqCannotReadQueues, "MsmqCannotReadQueues" },
|
|
{ TraceCode.MsmqDatagramSent, "MsmqDatagramSent" },
|
|
{ TraceCode.MsmqDatagramReceived, "MsmqDatagramReceived" },
|
|
{ TraceCode.MsmqDetected, "MsmqDetected" },
|
|
{ TraceCode.MsmqEnteredBatch, "MsmqEnteredBatch" },
|
|
{ TraceCode.MsmqExpectedException, "MsmqExpectedException" },
|
|
{ TraceCode.MsmqFoundBaseAddress, "MsmqFoundBaseAddress" },
|
|
{ TraceCode.MsmqLeftBatch, "MsmqLeftBatch" },
|
|
{ TraceCode.MsmqMatchedApplicationFound, "MsmqMatchedApplicationFound" },
|
|
{ TraceCode.MsmqMessageDropped, "MsmqMessageDropped" },
|
|
{ TraceCode.MsmqMessageLockedUnderTheTransaction, "MsmqMessageLockedUnderTheTransaction" },
|
|
{ TraceCode.MsmqMessageRejected, "MsmqMessageRejected" },
|
|
{ TraceCode.MsmqMoveOrDeleteAttemptFailed, "MsmqMoveOrDeleteAttemptFailed" },
|
|
{ TraceCode.MsmqPoisonMessageMovedPoison, "MsmqPoisonMessageMovedPoison" },
|
|
{ TraceCode.MsmqPoisonMessageMovedRetry, "MsmqPoisonMessageMovedRetry" },
|
|
{ TraceCode.MsmqPoisonMessageRejected, "MsmqPoisonMessageRejected" },
|
|
{ TraceCode.MsmqPoolFull, "MsmqPoolFull" },
|
|
{ TraceCode.MsmqPotentiallyPoisonMessageDetected, "MsmqPotentiallyPoisonMessageDetected" },
|
|
{ TraceCode.MsmqQueueClosed, "MsmqQueueClosed" },
|
|
{ TraceCode.MsmqQueueOpened, "MsmqQueueOpened" },
|
|
{ TraceCode.MsmqQueueTransactionalStatusUnknown, "MsmqQueueTransactionalStatusUnknown" },
|
|
{ TraceCode.MsmqScanStarted, "MsmqScanStarted" },
|
|
{ TraceCode.MsmqSessiongramReceived, "MsmqSessiongramReceived" },
|
|
{ TraceCode.MsmqSessiongramSent, "MsmqSessiongramSent" },
|
|
{ TraceCode.MsmqStartingApplication, "MsmqStartingApplication" },
|
|
{ TraceCode.MsmqStartingService, "MsmqStartingService" },
|
|
{ TraceCode.MsmqUnexpectedAcknowledgment, "MsmqUnexpectedAcknowledgment" },
|
|
{ TraceCode.WsrmNegativeElapsedTimeDetected, "WsrmNegativeElapsedTimeDetected" },
|
|
{ TraceCode.TcpTransferError, "TcpTransferError" },
|
|
{ TraceCode.TcpConnectionResetError, "TcpConnectionResetError" },
|
|
{ TraceCode.TcpConnectionTimedOut, "TcpConnectionTimedOut" },
|
|
|
|
// ComIntegration trace codes (TraceCode.ComIntegration)
|
|
{ TraceCode.ComIntegrationServiceHostStartingService, "ComIntegrationServiceHostStartingService" },
|
|
{ TraceCode.ComIntegrationServiceHostStartedService, "ComIntegrationServiceHostStartedService" },
|
|
{ TraceCode.ComIntegrationServiceHostCreatedServiceContract, "ComIntegrationServiceHostCreatedServiceContract" },
|
|
{ TraceCode.ComIntegrationServiceHostStartedServiceDetails, "ComIntegrationServiceHostStartedServiceDetails" },
|
|
{ TraceCode.ComIntegrationServiceHostCreatedServiceEndpoint, "ComIntegrationServiceHostCreatedServiceEndpoint" },
|
|
{ TraceCode.ComIntegrationServiceHostStoppingService, "ComIntegrationServiceHostStoppingService" },
|
|
{ TraceCode.ComIntegrationServiceHostStoppedService, "ComIntegrationServiceHostStoppedService" },
|
|
{ TraceCode.ComIntegrationDllHostInitializerStarting, "ComIntegrationDllHostInitializerStarting" },
|
|
{ TraceCode.ComIntegrationDllHostInitializerAddingHost, "ComIntegrationDllHostInitializerAddingHost" },
|
|
{ TraceCode.ComIntegrationDllHostInitializerStarted, "ComIntegrationDllHostInitializerStarted" },
|
|
{ TraceCode.ComIntegrationDllHostInitializerStopping, "ComIntegrationDllHostInitializerStopping" },
|
|
{ TraceCode.ComIntegrationDllHostInitializerStopped, "ComIntegrationDllHostInitializerStopped" },
|
|
{ TraceCode.ComIntegrationTLBImportStarting, "ComIntegrationTLBImportStarting" },
|
|
{ TraceCode.ComIntegrationTLBImportFromAssembly, "ComIntegrationTLBImportFromAssembly" },
|
|
{ TraceCode.ComIntegrationTLBImportFromTypelib, "ComIntegrationTLBImportFromTypelib" },
|
|
{ TraceCode.ComIntegrationTLBImportConverterEvent, "ComIntegrationTLBImportConverterEvent" },
|
|
{ TraceCode.ComIntegrationTLBImportFinished, "ComIntegrationTLBImportFinished" },
|
|
{ TraceCode.ComIntegrationInstanceCreationRequest, "ComIntegrationInstanceCreationRequest" },
|
|
{ TraceCode.ComIntegrationInstanceCreationSuccess, "ComIntegrationInstanceCreationSuccess" },
|
|
{ TraceCode.ComIntegrationInstanceReleased, "ComIntegrationInstanceReleased" },
|
|
{ TraceCode.ComIntegrationEnteringActivity, "ComIntegrationEnteringActivity" },
|
|
{ TraceCode.ComIntegrationExecutingCall, "ComIntegrationExecutingCall" },
|
|
{ TraceCode.ComIntegrationLeftActivity, "ComIntegrationLeftActivity" },
|
|
{ TraceCode.ComIntegrationInvokingMethod, "ComIntegrationInvokingMethod" },
|
|
{ TraceCode.ComIntegrationInvokedMethod, "ComIntegrationInvokedMethod" },
|
|
{ TraceCode.ComIntegrationInvokingMethodNewTransaction, "ComIntegrationInvokingMethodNewTransaction" },
|
|
{ TraceCode.ComIntegrationInvokingMethodContextTransaction, "ComIntegrationInvokingMethodContextTransaction" },
|
|
{ TraceCode.ComIntegrationServiceMonikerParsed, "ComIntegrationServiceMonikerParsed" },
|
|
{ TraceCode.ComIntegrationWsdlChannelBuilderLoaded, "ComIntegrationWsdlChannelBuilderLoaded" },
|
|
{ TraceCode.ComIntegrationTypedChannelBuilderLoaded, "ComIntegrationTypedChannelBuilderLoaded" },
|
|
{ TraceCode.ComIntegrationChannelCreated, "ComIntegrationChannelCreated" },
|
|
{ TraceCode.ComIntegrationDispatchMethod, "ComIntegrationDispatchMethod" },
|
|
{ TraceCode.ComIntegrationTxProxyTxCommitted, "ComIntegrationTxProxyTxCommitted" },
|
|
{ TraceCode.ComIntegrationTxProxyTxAbortedByContext, "ComIntegrationTxProxyTxAbortedByContext" },
|
|
{ TraceCode.ComIntegrationTxProxyTxAbortedByTM, "ComIntegrationTxProxyTxAbortedByTM" },
|
|
{ TraceCode.ComIntegrationMexMonikerMetadataExchangeComplete, "ComIntegrationMexMonikerMetadataExchangeComplete" },
|
|
{ TraceCode.ComIntegrationMexChannelBuilderLoaded, "ComIntegrationMexChannelBuilderLoaded" },
|
|
|
|
// Security trace codes (TraceCode.Security)
|
|
{ TraceCode.Security, "Security" },
|
|
{ TraceCode.SecurityIdentityVerificationSuccess, "SecurityIdentityVerificationSuccess" },
|
|
{ TraceCode.SecurityIdentityVerificationFailure, "SecurityIdentityVerificationFailure" },
|
|
{ TraceCode.SecurityIdentityDeterminationSuccess, "SecurityIdentityDeterminationSuccess" },
|
|
{ TraceCode.SecurityIdentityDeterminationFailure, "SecurityIdentityDeterminationFailure" },
|
|
{ TraceCode.SecurityIdentityHostNameNormalizationFailure, "SecurityIdentityHostNameNormalizationFailure" },
|
|
{ TraceCode.SecurityImpersonationSuccess, "SecurityImpersonationSuccess" },
|
|
{ TraceCode.SecurityImpersonationFailure, "SecurityImpersonationFailure" },
|
|
{ TraceCode.SecurityNegotiationProcessingFailure, "SecurityNegotiationProcessingFailure" },
|
|
{ TraceCode.IssuanceTokenProviderRemovedCachedToken, "IssuanceTokenProviderRemovedCachedToken" },
|
|
{ TraceCode.IssuanceTokenProviderUsingCachedToken, "IssuanceTokenProviderUsingCachedToken" },
|
|
{ TraceCode.IssuanceTokenProviderBeginSecurityNegotiation, "IssuanceTokenProviderBeginSecurityNegotiation" },
|
|
{ TraceCode.IssuanceTokenProviderEndSecurityNegotiation, "IssuanceTokenProviderEndSecurityNegotiation" },
|
|
{ TraceCode.IssuanceTokenProviderRedirectApplied, "IssuanceTokenProviderRedirectApplied" },
|
|
{ TraceCode.IssuanceTokenProviderServiceTokenCacheFull, "IssuanceTokenProviderServiceTokenCacheFull" },
|
|
{ TraceCode.NegotiationTokenProviderAttached, "NegotiationTokenProviderAttached" },
|
|
{ TraceCode.SpnegoClientNegotiationCompleted, "SpnegoClientNegotiationCompleted" },
|
|
{ TraceCode.SpnegoServiceNegotiationCompleted, "SpnegoServiceNegotiationCompleted" },
|
|
{ TraceCode.SpnegoClientNegotiation, "SpnegoClientNegotiation" },
|
|
{ TraceCode.SpnegoServiceNegotiation, "SpnegoServiceNegotiation" },
|
|
{ TraceCode.NegotiationAuthenticatorAttached, "NegotiationAuthenticatorAttached" },
|
|
{ TraceCode.ServiceSecurityNegotiationCompleted, "ServiceSecurityNegotiationCompleted" },
|
|
{ TraceCode.SecurityContextTokenCacheFull, "SecurityContextTokenCacheFull" },
|
|
{ TraceCode.ExportSecurityChannelBindingEntry, "ExportSecurityChannelBindingEntry" },
|
|
{ TraceCode.ExportSecurityChannelBindingExit, "ExportSecurityChannelBindingExit" },
|
|
{ TraceCode.ImportSecurityChannelBindingEntry, "ImportSecurityChannelBindingEntry" },
|
|
{ TraceCode.ImportSecurityChannelBindingExit, "ImportSecurityChannelBindingExit" },
|
|
{ TraceCode.SecurityTokenProviderOpened, "SecurityTokenProviderOpened" },
|
|
{ TraceCode.SecurityTokenProviderClosed, "SecurityTokenProviderClosed" },
|
|
{ TraceCode.SecurityTokenAuthenticatorOpened, "SecurityTokenAuthenticatorOpened" },
|
|
{ TraceCode.SecurityTokenAuthenticatorClosed, "SecurityTokenAuthenticatorClosed" },
|
|
{ TraceCode.SecurityBindingOutgoingMessageSecured, "SecurityBindingOutgoingMessageSecured" },
|
|
{ TraceCode.SecurityBindingIncomingMessageVerified, "SecurityBindingIncomingMessageVerified" },
|
|
{ TraceCode.SecurityBindingSecureOutgoingMessageFailure, "SecurityBindingSecureOutgoingMessageFailure" },
|
|
{ TraceCode.SecurityBindingVerifyIncomingMessageFailure, "SecurityBindingVerifyIncomingMessageFailure" },
|
|
{ TraceCode.SecuritySpnToSidMappingFailure, "SecuritySpnToSidMappingFailure" },
|
|
{ TraceCode.SecuritySessionRedirectApplied, "SecuritySessionRedirectApplied" },
|
|
{ TraceCode.SecurityClientSessionCloseSent, "SecurityClientSessionCloseSent" },
|
|
{ TraceCode.SecurityClientSessionCloseResponseSent, "SecurityClientSessionCloseResponseSent" },
|
|
{ TraceCode.SecurityClientSessionCloseMessageReceived, "SecurityClientSessionCloseMessageReceived" },
|
|
{ TraceCode.SecuritySessionKeyRenewalFaultReceived, "SecuritySessionKeyRenewalFaultReceived" },
|
|
{ TraceCode.SecuritySessionAbortedFaultReceived, "SecuritySessionAbortedFaultReceived" },
|
|
{ TraceCode.SecuritySessionClosedResponseReceived, "SecuritySessionClosedResponseReceived" },
|
|
{ TraceCode.SecurityClientSessionPreviousKeyDiscarded, "SecurityClientSessionPreviousKeyDiscarded" },
|
|
{ TraceCode.SecurityClientSessionKeyRenewed, "SecurityClientSessionKeyRenewed" },
|
|
{ TraceCode.SecurityPendingServerSessionAdded, "SecurityPendingServerSessionAdded" },
|
|
{ TraceCode.SecurityPendingServerSessionClosed, "SecurityPendingServerSessionClosed" },
|
|
{ TraceCode.SecurityPendingServerSessionActivated, "SecurityPendingServerSessionActivated" },
|
|
{ TraceCode.SecurityActiveServerSessionRemoved, "SecurityActiveServerSessionRemoved" },
|
|
{ TraceCode.SecurityNewServerSessionKeyIssued, "SecurityNewServerSessionKeyIssued" },
|
|
{ TraceCode.SecurityInactiveSessionFaulted, "SecurityInactiveSessionFaulted" },
|
|
{ TraceCode.SecurityServerSessionKeyUpdated, "SecurityServerSessionKeyUpdated" },
|
|
{ TraceCode.SecurityServerSessionCloseReceived, "SecurityServerSessionCloseReceived" },
|
|
{ TraceCode.SecurityServerSessionRenewalFaultSent, "SecurityServerSessionRenewalFaultSent" },
|
|
{ TraceCode.SecurityServerSessionAbortedFaultSent, "SecurityServerSessionAbortedFaultSent" },
|
|
{ TraceCode.SecuritySessionCloseResponseSent, "SecuritySessionCloseResponseSent" },
|
|
{ TraceCode.SecuritySessionServerCloseSent, "SecuritySessionServerCloseSent" },
|
|
{ TraceCode.SecurityServerSessionCloseResponseReceived, "SecurityServerSessionCloseResponseReceived" },
|
|
{ TraceCode.SecuritySessionRenewFaultSendFailure, "SecuritySessionRenewFaultSendFailure" },
|
|
{ TraceCode.SecuritySessionAbortedFaultSendFailure, "SecuritySessionAbortedFaultSendFailure" },
|
|
{ TraceCode.SecuritySessionClosedResponseSendFailure, "SecuritySessionClosedResponseSendFailure" },
|
|
{ TraceCode.SecuritySessionServerCloseSendFailure, "SecuritySessionServerCloseSendFailure" },
|
|
{ TraceCode.SecuritySessionRequestorStartOperation, "SecuritySessionRequestorStartOperation" },
|
|
{ TraceCode.SecuritySessionRequestorOperationSuccess, "SecuritySessionRequestorOperationSuccess" },
|
|
{ TraceCode.SecuritySessionRequestorOperationFailure, "SecuritySessionRequestorOperationFailure" },
|
|
{ TraceCode.SecuritySessionResponderOperationFailure, "SecuritySessionResponderOperationFailure" },
|
|
{ TraceCode.SecuritySessionDemuxFailure, "SecuritySessionDemuxFailure" },
|
|
{ TraceCode.SecurityAuditWrittenSuccess, "SecurityAuditWrittenSuccess" },
|
|
{ TraceCode.SecurityAuditWrittenFailure, "SecurityAuditWrittenFailure" },
|
|
|
|
// ServiceModel trace codes (TraceCode.ServiceModel)
|
|
{ TraceCode.AsyncCallbackThrewException, "AsyncCallbackThrewException" },
|
|
{ TraceCode.CommunicationObjectAborted, "CommunicationObjectAborted" },
|
|
{ TraceCode.CommunicationObjectAbortFailed, "CommunicationObjectAbortFailed" },
|
|
{ TraceCode.CommunicationObjectCloseFailed, "CommunicationObjectCloseFailed" },
|
|
{ TraceCode.CommunicationObjectOpenFailed, "CommunicationObjectOpenFailed" },
|
|
{ TraceCode.CommunicationObjectClosing, "CommunicationObjectClosing" },
|
|
{ TraceCode.CommunicationObjectClosed, "CommunicationObjectClosed" },
|
|
{ TraceCode.CommunicationObjectCreated, "CommunicationObjectCreated" },
|
|
{ TraceCode.CommunicationObjectDisposing, "CommunicationObjectDisposing" },
|
|
{ TraceCode.CommunicationObjectFaultReason, "CommunicationObjectFaultReason" },
|
|
{ TraceCode.CommunicationObjectFaulted, "CommunicationObjectFaulted" },
|
|
{ TraceCode.CommunicationObjectOpening, "CommunicationObjectOpening" },
|
|
{ TraceCode.CommunicationObjectOpened, "CommunicationObjectOpened" },
|
|
{ TraceCode.DidNotUnderstandMessageHeader, "DidNotUnderstandMessageHeader" },
|
|
{ TraceCode.UnderstoodMessageHeader, "UnderstoodMessageHeader" },
|
|
{ TraceCode.MessageClosed, "MessageClosed" },
|
|
{ TraceCode.MessageClosedAgain, "MessageClosedAgain" },
|
|
{ TraceCode.MessageCopied, "MessageCopied" },
|
|
{ TraceCode.MessageRead, "MessageRead" },
|
|
{ TraceCode.MessageWritten, "MessageWritten" },
|
|
{ TraceCode.BeginExecuteMethod, "BeginExecuteMethod" },
|
|
{ TraceCode.ConfigurationIsReadOnly, "ConfigurationIsReadOnly" },
|
|
{ TraceCode.ConfiguredExtensionTypeNotFound, "ConfiguredExtensionTypeNotFound" },
|
|
{ TraceCode.EvaluationContextNotFound, "EvaluationContextNotFound" },
|
|
{ TraceCode.EndExecuteMethod, "EndExecuteMethod" },
|
|
{ TraceCode.ExtensionCollectionDoesNotExist, "ExtensionCollectionDoesNotExist" },
|
|
{ TraceCode.ExtensionCollectionNameNotFound, "ExtensionCollectionNameNotFound" },
|
|
{ TraceCode.ExtensionCollectionIsEmpty, "ExtensionCollectionIsEmpty" },
|
|
{ TraceCode.ExtensionElementAlreadyExistsInCollection, "ExtensionElementAlreadyExistsInCollection" },
|
|
{ TraceCode.ElementTypeDoesntMatchConfiguredType, "ElementTypeDoesntMatchConfiguredType" },
|
|
{ TraceCode.ErrorInvokingUserCode, "ErrorInvokingUserCode" },
|
|
{ TraceCode.GetBehaviorElement, "GetBehaviorElement" },
|
|
{ TraceCode.GetCommonBehaviors, "GetCommonBehaviors" },
|
|
{ TraceCode.GetConfiguredBinding, "GetConfiguredBinding" },
|
|
{ TraceCode.GetChannelEndpointElement, "GetChannelEndpointElement" },
|
|
{ TraceCode.GetConfigurationSection, "GetConfigurationSection" },
|
|
{ TraceCode.GetDefaultConfiguredBinding, "GetDefaultConfiguredBinding" },
|
|
{ TraceCode.GetServiceElement, "GetServiceElement" },
|
|
{ TraceCode.MessageProcessingPaused, "MessageProcessingPaused" },
|
|
{ TraceCode.ManualFlowThrottleLimitReached, "ManualFlowThrottleLimitReached" },
|
|
{ TraceCode.OverridingDuplicateConfigurationKey, "OverridingDuplicateConfigurationKey" },
|
|
{ TraceCode.RemoveBehavior, "RemoveBehavior" },
|
|
{ TraceCode.ServiceChannelLifetime, "ServiceChannelLifetime" },
|
|
{ TraceCode.ServiceHostCreation, "ServiceHostCreation" },
|
|
{ TraceCode.ServiceHostBaseAddresses, "ServiceHostBaseAddresses" },
|
|
{ TraceCode.ServiceHostTimeoutOnClose, "ServiceHostTimeoutOnClose" },
|
|
{ TraceCode.ServiceHostFaulted, "ServiceHostFaulted" },
|
|
{ TraceCode.ServiceHostErrorOnReleasePerformanceCounter, "ServiceHostErrorOnReleasePerformanceCounter" },
|
|
{ TraceCode.ServiceThrottleLimitReached, "ServiceThrottleLimitReached" },
|
|
{ TraceCode.ServiceOperationMissingReply, "ServiceOperationMissingReply" },
|
|
{ TraceCode.ServiceOperationMissingReplyContext, "ServiceOperationMissingReplyContext" },
|
|
{ TraceCode.ServiceOperationExceptionOnReply, "ServiceOperationExceptionOnReply" },
|
|
{ TraceCode.SkipBehavior, "SkipBehavior" },
|
|
{ TraceCode.TransportListen, "TransportListen" },
|
|
{ TraceCode.UnhandledAction, "UnhandledAction" },
|
|
{ TraceCode.PerformanceCounterFailedToLoad, "PerformanceCounterFailedToLoad" },
|
|
{ TraceCode.PerformanceCountersFailed, "PerformanceCountersFailed" },
|
|
{ TraceCode.PerformanceCountersFailedDuringUpdate, "PerformanceCountersFailedDuringUpdate" },
|
|
{ TraceCode.PerformanceCountersFailedForService, "PerformanceCountersFailedForService" },
|
|
{ TraceCode.PerformanceCountersFailedOnRelease, "PerformanceCountersFailedOnRelease" },
|
|
{ TraceCode.WsmexNonCriticalWsdlExportError, "WsmexNonCriticalWsdlExportError" },
|
|
{ TraceCode.WsmexNonCriticalWsdlImportError, "WsmexNonCriticalWsdlImportError" },
|
|
{ TraceCode.FailedToOpenIncomingChannel, "FailedToOpenIncomingChannel" },
|
|
{ TraceCode.UnhandledExceptionInUserOperation, "UnhandledExceptionInUserOperation" },
|
|
{ TraceCode.DroppedAMessage, "DroppedAMessage" },
|
|
{ TraceCode.CannotBeImportedInCurrentFormat, "CannotBeImportedInCurrentFormat" },
|
|
{ TraceCode.GetConfiguredEndpoint, "GetConfiguredEndpoint" },
|
|
{ TraceCode.GetDefaultConfiguredEndpoint, "GetDefaultConfiguredEndpoint" },
|
|
{ TraceCode.ExtensionTypeNotFound, "ExtensionTypeNotFound" },
|
|
{ TraceCode.DefaultEndpointsAdded, "DefaultEndpointsAdded" },
|
|
|
|
//ServiceModel Metadata codes
|
|
{ TraceCode.MetadataExchangeClientSendRequest, "MetadataExchangeClientSendRequest" },
|
|
{ TraceCode.MetadataExchangeClientReceiveReply, "MetadataExchangeClientReceiveReply" },
|
|
{ TraceCode.WarnHelpPageEnabledNoBaseAddress, "WarnHelpPageEnabledNoBaseAddress" },
|
|
|
|
// PortSharingtrace codes (TraceCode.PortSharing)
|
|
{ TraceCode.PortSharingClosed, "PortSharingClosed" },
|
|
{ TraceCode.PortSharingDuplicatedPipe, "PortSharingDuplicatedPipe" },
|
|
{ TraceCode.PortSharingDupHandleGranted, "PortSharingDupHandleGranted" },
|
|
{ TraceCode.PortSharingDuplicatedSocket, "PortSharingDuplicatedSocket" },
|
|
{ TraceCode.PortSharingListening, "PortSharingListening" },
|
|
{ TraceCode.SharedManagerServiceEndpointNotExist, "SharedManagerServiceEndpointNotExist" },
|
|
|
|
//Indigo Tx trace codes (TraceCode.ServiceModelTransaction)
|
|
{ TraceCode.TxSourceTxScopeRequiredIsTransactedTransport, "TxSourceTxScopeRequiredIsTransactedTransport" },
|
|
{ TraceCode.TxSourceTxScopeRequiredIsTransactionFlow, "TxSourceTxScopeRequiredIsTransactionFlow" },
|
|
{ TraceCode.TxSourceTxScopeRequiredIsAttachedTransaction, "TxSourceTxScopeRequiredIsAttachedTransaction" },
|
|
{ TraceCode.TxSourceTxScopeRequiredIsCreateNewTransaction, "TxSourceTxScopeRequiredIsCreateNewTransaction" },
|
|
{ TraceCode.TxCompletionStatusCompletedForAutocomplete, "TxCompletionStatusCompletedForAutocomplete" },
|
|
{ TraceCode.TxCompletionStatusCompletedForError, "TxCompletionStatusCompletedForError" },
|
|
{ TraceCode.TxCompletionStatusCompletedForSetComplete, "TxCompletionStatusCompletedForSetComplete" },
|
|
{ TraceCode.TxCompletionStatusCompletedForTACOSC, "TxCompletionStatusCompletedForTACOSC" },
|
|
{ TraceCode.TxCompletionStatusCompletedForAsyncAbort, "TxCompletionStatusCompletedForAsyncAbort" },
|
|
{ TraceCode.TxCompletionStatusRemainsAttached, "TxCompletionStatusRemainsAttached" },
|
|
{ TraceCode.TxCompletionStatusAbortedOnSessionClose, "TxCompletionStatusAbortedOnSessionClose" },
|
|
{ TraceCode.TxReleaseServiceInstanceOnCompletion, "TxReleaseServiceInstanceOnCompletion" },
|
|
{ TraceCode.TxAsyncAbort, "TxAsyncAbort" },
|
|
{ TraceCode.TxFailedToNegotiateOleTx, "TxFailedToNegotiateOleTx" },
|
|
{ TraceCode.TxSourceTxScopeRequiredUsingExistingTransaction, "TxSourceTxScopeRequiredUsingExistingTransaction" },
|
|
|
|
//CfxGreen trace codes (TraceCode.NetFx35)
|
|
{ TraceCode.ActivatingMessageReceived, "ActivatingMessageReceived" },
|
|
{ TraceCode.InstanceContextBoundToDurableInstance, "InstanceContextBoundToDurableInstance" },
|
|
{ TraceCode.InstanceContextDetachedFromDurableInstance, "InstanceContextDetachedFromDurableInstance" },
|
|
{ TraceCode.ContextChannelFactoryChannelCreated, "ContextChannelFactoryChannelCreated" },
|
|
{ TraceCode.ContextChannelListenerChannelAccepted, "ContextChannelListenerChannelAccepted" },
|
|
{ TraceCode.ContextProtocolContextAddedToMessage, "ContextProtocolContextAddedToMessage" },
|
|
{ TraceCode.ContextProtocolContextRetrievedFromMessage, "ContextProtocolContextRetrievedFromMessage" },
|
|
{ TraceCode.DICPInstanceContextCached, "DICPInstanceContextCached" },
|
|
{ TraceCode.DICPInstanceContextRemovedFromCache, "DICPInstanceContextRemovedFromCache" },
|
|
{ TraceCode.ServiceDurableInstanceDeleted, "ServiceDurableInstanceDeleted" },
|
|
{ TraceCode.ServiceDurableInstanceDisposed, "ServiceDurableInstanceDisposed" },
|
|
{ TraceCode.ServiceDurableInstanceLoaded, "ServiceDurableInstanceLoaded" },
|
|
{ TraceCode.ServiceDurableInstanceSaved, "ServiceDurableInstanceSaved" },
|
|
{ TraceCode.SqlPersistenceProviderSQLCallStart, "SqlPersistenceProviderSQLCallStart" },
|
|
{ TraceCode.SqlPersistenceProviderSQLCallEnd, "SqlPersistenceProviderSQLCallEnd" },
|
|
{ TraceCode.SqlPersistenceProviderOpenParameters, "SqlPersistenceProviderOpenParameters" },
|
|
{ TraceCode.SyncContextSchedulerServiceTimerCancelled, "SyncContextSchedulerServiceTimerCancelled" },
|
|
{ TraceCode.SyncContextSchedulerServiceTimerCreated, "SyncContextSchedulerServiceTimerCreated" },
|
|
{ TraceCode.WorkflowDurableInstanceLoaded, "WorkflowDurableInstanceLoaded" },
|
|
{ TraceCode.WorkflowDurableInstanceAborted, "WorkflowDurableInstanceAborted" },
|
|
{ TraceCode.WorkflowDurableInstanceActivated, "WorkflowDurableInstanceActivated" },
|
|
{ TraceCode.WorkflowOperationInvokerItemQueued, "WorkflowOperationInvokerItemQueued" },
|
|
{ TraceCode.WorkflowRequestContextReplySent, "WorkflowRequestContextReplySent" },
|
|
{ TraceCode.WorkflowRequestContextFaultSent, "WorkflowRequestContextFaultSent" },
|
|
{ TraceCode.WorkflowServiceHostCreated, "WorkflowServiceHostCreated" },
|
|
{ TraceCode.SyndicationReadFeedBegin, "SyndicationReadFeedBegin" },
|
|
{ TraceCode.SyndicationReadFeedEnd, "SyndicationReadFeedEnd" },
|
|
{ TraceCode.SyndicationReadItemBegin, "SyndicationReadItemBegin" },
|
|
{ TraceCode.SyndicationReadItemEnd, "SyndicationReadItemEnd" },
|
|
{ TraceCode.SyndicationWriteFeedBegin, "SyndicationWriteFeedBegin" },
|
|
{ TraceCode.SyndicationWriteFeedEnd, "SyndicationWriteFeedEnd" },
|
|
{ TraceCode.SyndicationWriteItemBegin, "SyndicationWriteItemBegin" },
|
|
{ TraceCode.SyndicationWriteItemEnd, "SyndicationWriteItemEnd" },
|
|
{ TraceCode.SyndicationProtocolElementIgnoredOnRead, "SyndicationProtocolElementIgnoredOnRead" },
|
|
{ TraceCode.SyndicationProtocolElementIgnoredOnWrite, "SyndicationProtocolElementIgnoredOnWrite" },
|
|
{ TraceCode.SyndicationProtocolElementInvalid, "SyndicationProtocolElementInvalid" },
|
|
{ TraceCode.WebUnknownQueryParameterIgnored, "WebUnknownQueryParameterIgnored" },
|
|
{ TraceCode.WebRequestMatchesOperation, "WebRequestMatchesOperation" },
|
|
{ TraceCode.WebRequestDoesNotMatchOperations, "WebRequestDoesNotMatchOperations" },
|
|
{ TraceCode.WebRequestRedirect, "WebRequestRedirect" },
|
|
{ TraceCode.SyndicationReadServiceDocumentBegin, "SyndicationReadServiceDocumentBegin" },
|
|
{ TraceCode.SyndicationReadServiceDocumentEnd, "SyndicationReadServiceDocumentEnd" },
|
|
{ TraceCode.SyndicationReadCategoriesDocumentBegin, "SyndicationReadCategoriesDocumentBegin" },
|
|
{ TraceCode.SyndicationReadCategoriesDocumentEnd, "SyndicationReadCategoriesDocumentEnd" },
|
|
{ TraceCode.SyndicationWriteServiceDocumentBegin, "SyndicationWriteServiceDocumentBegin" },
|
|
{ TraceCode.SyndicationWriteServiceDocumentEnd, "SyndicationWriteServiceDocumentEnd" },
|
|
{ TraceCode.SyndicationWriteCategoriesDocumentBegin, "SyndicationWriteCategoriesDocumentBegin" },
|
|
{ TraceCode.SyndicationWriteCategoriesDocumentEnd, "SyndicationWriteCategoriesDocumentEnd" },
|
|
{ TraceCode.AutomaticFormatSelectedOperationDefault, "AutomaticFormatSelectedOperationDefault" },
|
|
{ TraceCode.AutomaticFormatSelectedRequestBased, "AutomaticFormatSelectedRequestBased" },
|
|
{ TraceCode.RequestFormatSelectedFromContentTypeMapper, "RequestFormatSelectedFromContentTypeMapper" },
|
|
{ TraceCode.RequestFormatSelectedByEncoderDefaults, "RequestFormatSelectedByEncoderDefaults" },
|
|
{ TraceCode.AddingResponseToOutputCache, "AddingResponseToOutputCache" },
|
|
{ TraceCode.AddingAuthenticatedResponseToOutputCache, "AddingAuthenticatedResponseToOutputCache" },
|
|
{ TraceCode.JsonpCallbackNameSet, "JsonpCallbackNameSet" },
|
|
};
|
|
|
|
public const string E2EActivityId = "E2EActivityId";
|
|
public const string TraceApplicationReference = "TraceApplicationReference";
|
|
|
|
public static InputQueue<T> CreateInputQueue<T>() where T : class
|
|
{
|
|
if (asyncCallbackGenerator == null)
|
|
{
|
|
asyncCallbackGenerator = new Func<Action<AsyncCallback, IAsyncResult>>(CallbackGenerator);
|
|
}
|
|
|
|
return new InputQueue<T>(asyncCallbackGenerator)
|
|
{
|
|
DisposeItemCallback = value =>
|
|
{
|
|
if (value is ICommunicationObject)
|
|
{
|
|
((ICommunicationObject)value).Abort();
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
static Action<AsyncCallback, IAsyncResult> CallbackGenerator()
|
|
{
|
|
if (DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
ServiceModelActivity callbackActivity = ServiceModelActivity.Current;
|
|
if (callbackActivity != null)
|
|
{
|
|
return delegate(AsyncCallback callback, IAsyncResult result)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(callbackActivity))
|
|
{
|
|
callback(result);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static internal void AddActivityHeader(Message message)
|
|
{
|
|
try
|
|
{
|
|
ActivityIdHeader activityIdHeader = new ActivityIdHeader(TraceUtility.ExtractActivityId(message));
|
|
activityIdHeader.AddTo(message);
|
|
}
|
|
#pragma warning suppress 56500 // covered by FxCOP
|
|
catch (Exception e)
|
|
{
|
|
if (Fx.IsFatal(e))
|
|
{
|
|
throw;
|
|
}
|
|
TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
|
|
SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
|
|
}
|
|
}
|
|
|
|
static internal void AddAmbientActivityToMessage(Message message)
|
|
{
|
|
try
|
|
{
|
|
ActivityIdHeader activityIdHeader = new ActivityIdHeader(DiagnosticTraceBase.ActivityId);
|
|
activityIdHeader.AddTo(message);
|
|
}
|
|
#pragma warning suppress 56500 // covered by FxCOP
|
|
catch (Exception e)
|
|
{
|
|
if (Fx.IsFatal(e))
|
|
{
|
|
throw;
|
|
}
|
|
TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToAddAnActivityIdHeader,
|
|
SR.GetString(SR.TraceCodeFailedToAddAnActivityIdHeader), e, message);
|
|
}
|
|
}
|
|
|
|
static internal void CopyActivity(Message source, Message destination)
|
|
{
|
|
if (DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
TraceUtility.SetActivity(destination, TraceUtility.ExtractActivity(source));
|
|
}
|
|
}
|
|
|
|
internal static long GetUtcBasedDurationForTrace(long startTicks)
|
|
{
|
|
if (startTicks > 0)
|
|
{
|
|
TimeSpan elapsedTime = new TimeSpan(DateTime.UtcNow.Ticks - startTicks);
|
|
return (long)elapsedTime.TotalMilliseconds;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
internal static ServiceModelActivity ExtractActivity(Message message)
|
|
{
|
|
ServiceModelActivity retval = null;
|
|
|
|
if ((DiagnosticUtility.ShouldUseActivity || TraceUtility.ShouldPropagateActivityGlobal) &&
|
|
(message != null) &&
|
|
(message.State != MessageState.Closed))
|
|
{
|
|
object property;
|
|
|
|
if (message.GetProperty(TraceUtility.ActivityIdKey, out property))
|
|
{
|
|
retval = property as ServiceModelActivity;
|
|
}
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
|
|
internal static ServiceModelActivity ExtractActivity(RequestContext request)
|
|
{
|
|
try
|
|
{
|
|
return TraceUtility.ExtractActivity(request.RequestMessage);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (Fx.IsFatal(e))
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
internal static Guid ExtractActivityId(Message message)
|
|
{
|
|
if (TraceUtility.MessageFlowTracingOnly)
|
|
{
|
|
return ActivityIdHeader.ExtractActivityId(message);
|
|
}
|
|
|
|
ServiceModelActivity activity = ExtractActivity(message);
|
|
return activity == null ? Guid.Empty : activity.Id;
|
|
}
|
|
|
|
internal static Guid GetReceivedActivityId(OperationContext operationContext)
|
|
{
|
|
object activityIdFromProprties;
|
|
if (!operationContext.IncomingMessageProperties.TryGetValue(E2EActivityId, out activityIdFromProprties))
|
|
{
|
|
return TraceUtility.ExtractActivityId(operationContext.IncomingMessage);
|
|
}
|
|
else
|
|
{
|
|
return (Guid)activityIdFromProprties;
|
|
}
|
|
}
|
|
|
|
internal static ServiceModelActivity ExtractAndRemoveActivity(Message message)
|
|
{
|
|
ServiceModelActivity retval = TraceUtility.ExtractActivity(message);
|
|
if (retval != null)
|
|
{
|
|
// If the property is just removed, the item is disposed and we don't want the thing
|
|
// to be disposed of.
|
|
message.SetProperty(TraceUtility.ActivityIdKey, false);
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
internal static void ProcessIncomingMessage(Message message, EventTraceActivity eventTraceActivity)
|
|
{
|
|
ServiceModelActivity activity = ServiceModelActivity.Current;
|
|
if (activity != null && DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
ServiceModelActivity incomingActivity = TraceUtility.ExtractActivity(message);
|
|
if (null != incomingActivity && incomingActivity.Id != activity.Id)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(incomingActivity))
|
|
{
|
|
if (null != FxTrace.Trace)
|
|
{
|
|
FxTrace.Trace.TraceTransfer(activity.Id);
|
|
}
|
|
}
|
|
}
|
|
TraceUtility.SetActivity(message, activity);
|
|
}
|
|
|
|
TraceUtility.MessageFlowAtMessageReceived(message, null, eventTraceActivity, true);
|
|
|
|
if (MessageLogger.LogMessagesAtServiceLevel)
|
|
{
|
|
MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelReceiveReply | MessageLoggingSource.LastChance);
|
|
}
|
|
}
|
|
|
|
internal static void ProcessOutgoingMessage(Message message, EventTraceActivity eventTraceActivity)
|
|
{
|
|
ServiceModelActivity activity = ServiceModelActivity.Current;
|
|
if (DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
TraceUtility.SetActivity(message, activity);
|
|
}
|
|
if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity)
|
|
{
|
|
TraceUtility.AddAmbientActivityToMessage(message);
|
|
}
|
|
|
|
TraceUtility.MessageFlowAtMessageSent(message, eventTraceActivity);
|
|
|
|
if (MessageLogger.LogMessagesAtServiceLevel)
|
|
{
|
|
MessageLogger.LogMessage(ref message, MessageLoggingSource.ServiceLevelSendRequest | MessageLoggingSource.LastChance);
|
|
}
|
|
}
|
|
|
|
internal static void SetActivity(Message message, ServiceModelActivity activity)
|
|
{
|
|
if (DiagnosticUtility.ShouldUseActivity && message != null && message.State != MessageState.Closed)
|
|
{
|
|
message.SetProperty(TraceUtility.ActivityIdKey, activity);
|
|
}
|
|
}
|
|
|
|
internal static void TraceDroppedMessage(Message message, EndpointDispatcher dispatcher)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceInformation)
|
|
{
|
|
EndpointAddress endpointAddress = null;
|
|
if (dispatcher != null)
|
|
{
|
|
endpointAddress = dispatcher.EndpointAddress;
|
|
}
|
|
TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.DroppedAMessage,
|
|
SR.GetString(SR.TraceCodeDroppedAMessage), new MessageDroppedTraceRecord(message, endpointAddress));
|
|
}
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription)
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, null, traceDescription, (Exception)null);
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData)
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, extendedData, null, (Exception)null);
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source)
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, null, source, (Exception)null);
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Exception exception)
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, null, source, exception);
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Message message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, null, (Exception)null);
|
|
}
|
|
else
|
|
{
|
|
TraceEvent(severity, traceCode, traceDescription, message, message);
|
|
}
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, object source, Message message)
|
|
{
|
|
Guid activityId = TraceUtility.ExtractActivityId(message);
|
|
if (DiagnosticUtility.ShouldTrace(severity))
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), null, activityId, message);
|
|
}
|
|
}
|
|
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, Exception exception, Message message)
|
|
{
|
|
Guid activityId = TraceUtility.ExtractActivityId(message);
|
|
if (DiagnosticUtility.ShouldTrace(severity))
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, new MessageTraceRecord(message), exception, activityId, null);
|
|
}
|
|
}
|
|
|
|
internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
|
|
}
|
|
|
|
// These methods require a TraceRecord to be allocated, so we want them to show up on profiles if the caller didn't avoid
|
|
// allocating the TraceRecord by using ShouldTrace.
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception)
|
|
{
|
|
if (DiagnosticUtility.ShouldTrace(severity))
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode), traceDescription, extendedData, exception, source);
|
|
}
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Message message)
|
|
{
|
|
Guid activityId = TraceUtility.ExtractActivityId(message);
|
|
if (DiagnosticUtility.ShouldTrace(severity))
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
|
|
traceDescription, extendedData, exception, activityId, source);
|
|
}
|
|
}
|
|
|
|
internal static void TraceEventNoCheck(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
|
|
traceDescription, extendedData, exception, activityId, source);
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
internal static void TraceEvent(TraceEventType severity, int traceCode, string traceDescription, TraceRecord extendedData, object source, Exception exception, Guid activityId)
|
|
{
|
|
if (DiagnosticUtility.ShouldTrace(severity))
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(severity, traceCode, GenerateMsdnTraceCode(traceCode),
|
|
traceDescription, extendedData, exception, activityId, source);
|
|
}
|
|
}
|
|
|
|
static string GenerateMsdnTraceCode(int traceCode)
|
|
{
|
|
int group = (int)(traceCode & 0xFFFF0000);
|
|
string terminatorUri = null;
|
|
switch (group)
|
|
{
|
|
case TraceCode.Administration:
|
|
terminatorUri = "System.ServiceModel.Administration";
|
|
break;
|
|
case TraceCode.Channels:
|
|
terminatorUri = "System.ServiceModel.Channels";
|
|
break;
|
|
case TraceCode.ComIntegration:
|
|
terminatorUri = "System.ServiceModel.ComIntegration";
|
|
break;
|
|
case TraceCode.Diagnostics:
|
|
terminatorUri = "System.ServiceModel.Diagnostics";
|
|
break;
|
|
case TraceCode.PortSharing:
|
|
terminatorUri = "System.ServiceModel.PortSharing";
|
|
break;
|
|
case TraceCode.Security:
|
|
terminatorUri = "System.ServiceModel.Security";
|
|
break;
|
|
case TraceCode.Serialization:
|
|
terminatorUri = "System.Runtime.Serialization";
|
|
break;
|
|
case TraceCode.ServiceModel:
|
|
case TraceCode.ServiceModelTransaction:
|
|
terminatorUri = "System.ServiceModel";
|
|
break;
|
|
default:
|
|
terminatorUri = string.Empty;
|
|
break;
|
|
}
|
|
|
|
Fx.Assert(traceCodes.ContainsKey(traceCode),
|
|
string.Format(CultureInfo.InvariantCulture, "Unsupported trace code: Please add trace code 0x{0} to the SortedList TraceUtility.traceCodes in {1}",
|
|
traceCode.ToString("X", CultureInfo.InvariantCulture), typeof(TraceUtility)));
|
|
#if !MONO
|
|
return LegacyDiagnosticTrace.GenerateMsdnTraceCode(terminatorUri, traceCodes[traceCode]);
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
internal static Exception ThrowHelperError(Exception exception, Message message)
|
|
{
|
|
// If the message is closed, we won't get an activity
|
|
Guid activityId = TraceUtility.ExtractActivityId(message);
|
|
if (DiagnosticUtility.ShouldTraceError)
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
|
|
TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
|
|
}
|
|
return exception;
|
|
}
|
|
|
|
internal static Exception ThrowHelperError(Exception exception, Guid activityId, object source)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceError)
|
|
{
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Error, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
|
|
TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, source);
|
|
}
|
|
return exception;
|
|
}
|
|
|
|
internal static Exception ThrowHelperWarning(Exception exception, Message message)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceWarning)
|
|
{
|
|
Guid activityId = TraceUtility.ExtractActivityId(message);
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning, TraceCode.ThrowingException, GenerateMsdnTraceCode(TraceCode.ThrowingException),
|
|
TraceSR.GetString(TraceSR.ThrowingException), null, exception, activityId, null);
|
|
}
|
|
return exception;
|
|
}
|
|
|
|
internal static ArgumentException ThrowHelperArgument(string paramName, string message, Message msg)
|
|
{
|
|
return (ArgumentException)TraceUtility.ThrowHelperError(new ArgumentException(message, paramName), msg);
|
|
}
|
|
|
|
internal static ArgumentNullException ThrowHelperArgumentNull(string paramName, Message message)
|
|
{
|
|
return (ArgumentNullException)TraceUtility.ThrowHelperError(new ArgumentNullException(paramName), message);
|
|
}
|
|
|
|
internal static string CreateSourceString(object source)
|
|
{
|
|
return source.GetType().ToString() + "/" + source.GetHashCode().ToString(CultureInfo.CurrentCulture);
|
|
}
|
|
|
|
internal static void TraceHttpConnectionInformation(string localEndpoint, string remoteEndpoint, object source)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceInformation)
|
|
{
|
|
Dictionary<string, string> values = new Dictionary<string, string>(2)
|
|
{
|
|
{ "LocalEndpoint", localEndpoint },
|
|
{ "RemoteEndpoint", remoteEndpoint }
|
|
};
|
|
TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.ConnectToIPEndpoint,
|
|
SR.GetString(SR.TraceCodeConnectToIPEndpoint), new DictionaryTraceRecord(values), source, null);
|
|
}
|
|
}
|
|
|
|
internal static void TraceUserCodeException(Exception e, MethodInfo method)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceWarning)
|
|
{
|
|
StringTraceRecord record = new StringTraceRecord("Comment",
|
|
SR.GetString(SR.SFxUserCodeThrewException, method.DeclaringType.FullName, method.Name));
|
|
DiagnosticUtility.DiagnosticTrace.TraceEvent(TraceEventType.Warning,
|
|
TraceCode.UnhandledExceptionInUserOperation, GenerateMsdnTraceCode(TraceCode.UnhandledExceptionInUserOperation),
|
|
SR.GetString(SR.TraceCodeUnhandledExceptionInUserOperation, method.DeclaringType.FullName, method.Name),
|
|
record,
|
|
e, null);
|
|
}
|
|
}
|
|
|
|
static TraceUtility()
|
|
{
|
|
//Maintain the order of calls
|
|
TraceUtility.SetEtwProviderId();
|
|
TraceUtility.SetEndToEndTracingFlags();
|
|
if (DiagnosticUtility.DiagnosticTrace != null)
|
|
{
|
|
DiagnosticTraceSource ts = (DiagnosticTraceSource)DiagnosticUtility.DiagnosticTrace.TraceSource;
|
|
TraceUtility.shouldPropagateActivity = (ts.PropagateActivity || TraceUtility.shouldPropagateActivityGlobal);
|
|
}
|
|
}
|
|
|
|
[Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
|
|
Safe = "Doesn't leak config section instance, just reads and stores bool values.")]
|
|
[SecuritySafeCritical]
|
|
static void SetEndToEndTracingFlags()
|
|
{
|
|
EndToEndTracingElement element = DiagnosticSection.UnsafeGetSection().EndToEndTracing;
|
|
TraceUtility.shouldPropagateActivityGlobal = element.PropagateActivity;
|
|
// if Sys.Diag trace is not enabled then the value is true if shouldPropagateActivityGlobal is true
|
|
TraceUtility.shouldPropagateActivity = TraceUtility.shouldPropagateActivityGlobal || TraceUtility.shouldPropagateActivity;
|
|
|
|
//Activity tracing is enabled by either of the flags (Sys.Diag trace source or E2E config element)
|
|
DiagnosticUtility.ShouldUseActivity = (DiagnosticUtility.ShouldUseActivity || element.ActivityTracing);
|
|
TraceUtility.activityTracing = DiagnosticUtility.ShouldUseActivity;
|
|
|
|
TraceUtility.messageFlowTracing = element.MessageFlowTracing || TraceUtility.activityTracing;
|
|
TraceUtility.messageFlowTracingOnly = element.MessageFlowTracing && !element.ActivityTracing;
|
|
|
|
//Set the flag if activity tracing is enabled through the E2E config element as well
|
|
DiagnosticUtility.TracingEnabled = (DiagnosticUtility.TracingEnabled || TraceUtility.activityTracing);
|
|
}
|
|
|
|
static public long RetrieveMessageNumber()
|
|
{
|
|
return Interlocked.Increment(ref TraceUtility.messageNumber);
|
|
}
|
|
|
|
static public bool PropagateUserActivity
|
|
{
|
|
get
|
|
{
|
|
return TraceUtility.ShouldPropagateActivity &&
|
|
TraceUtility.PropagateUserActivityCore;
|
|
}
|
|
}
|
|
|
|
// Most of the time, shouldPropagateActivity will be false.
|
|
// This property will rarely be executed as a result.
|
|
static bool PropagateUserActivityCore
|
|
{
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return !(DiagnosticUtility.TracingEnabled) &&
|
|
DiagnosticTraceBase.ActivityId != Guid.Empty;
|
|
}
|
|
}
|
|
|
|
static internal string GetCallerInfo(OperationContext context)
|
|
{
|
|
if (context != null && context.IncomingMessageProperties != null)
|
|
{
|
|
object endpointMessageProperty;
|
|
if (context.IncomingMessageProperties.TryGetValue(RemoteEndpointMessageProperty.Name, out endpointMessageProperty))
|
|
{
|
|
RemoteEndpointMessageProperty endpoint = endpointMessageProperty as RemoteEndpointMessageProperty;
|
|
if (endpoint != null)
|
|
{
|
|
return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", endpoint.Address, endpoint.Port);
|
|
}
|
|
}
|
|
}
|
|
return "null";
|
|
}
|
|
|
|
[Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
|
|
Safe = "Doesn't leak config section instance, just reads and stores string values for Guid")]
|
|
[SecuritySafeCritical]
|
|
static internal void SetEtwProviderId()
|
|
{
|
|
// Get section should not trace as the ETW provider id is not set yet
|
|
DiagnosticSection diagnostics = DiagnosticSection.UnsafeGetSectionNoTrace();
|
|
Guid etwProviderId = Guid.Empty;
|
|
//set the Id in PT if specified in the config file. If not, ETW tracing is off.
|
|
if (PartialTrustHelpers.HasEtwPermissions() || diagnostics.IsEtwProviderIdFromConfigFile())
|
|
{
|
|
etwProviderId = Fx.CreateGuid(diagnostics.EtwProviderId);
|
|
}
|
|
System.Runtime.Diagnostics.EtwDiagnosticTrace.DefaultEtwProviderId = etwProviderId;
|
|
}
|
|
|
|
static internal void SetActivityId(MessageProperties properties)
|
|
{
|
|
Guid activityId;
|
|
if ((null != properties) && properties.TryGetValue(TraceUtility.E2EActivityId, out activityId))
|
|
{
|
|
DiagnosticTraceBase.ActivityId = activityId;
|
|
}
|
|
}
|
|
|
|
static internal bool ShouldPropagateActivity
|
|
{
|
|
get { return TraceUtility.shouldPropagateActivity; }
|
|
}
|
|
|
|
static internal bool ShouldPropagateActivityGlobal
|
|
{
|
|
get { return TraceUtility.shouldPropagateActivityGlobal; }
|
|
}
|
|
|
|
static internal bool ActivityTracing
|
|
{
|
|
get { return TraceUtility.activityTracing; }
|
|
}
|
|
|
|
static internal bool MessageFlowTracing
|
|
{
|
|
get { return TraceUtility.messageFlowTracing; }
|
|
}
|
|
|
|
static internal bool MessageFlowTracingOnly
|
|
{
|
|
get { return TraceUtility.messageFlowTracingOnly; }
|
|
}
|
|
|
|
static internal void MessageFlowAtMessageSent(Message message, EventTraceActivity eventTraceActivity)
|
|
{
|
|
if (TraceUtility.MessageFlowTracing)
|
|
{
|
|
Guid activityId;
|
|
Guid correlationId;
|
|
bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
|
|
|
|
if (TraceUtility.MessageFlowTracingOnly)
|
|
{
|
|
if (activityIdFound && activityId != DiagnosticTraceBase.ActivityId)
|
|
{
|
|
DiagnosticTraceBase.ActivityId = activityId;
|
|
}
|
|
}
|
|
|
|
if (TD.MessageSentToTransportIsEnabled())
|
|
{
|
|
TD.MessageSentToTransport(eventTraceActivity, correlationId);
|
|
}
|
|
}
|
|
}
|
|
|
|
static internal void MessageFlowAtMessageReceived(Message message, OperationContext context, EventTraceActivity eventTraceActivity, bool createNewActivityId)
|
|
{
|
|
if (TraceUtility.MessageFlowTracing)
|
|
{
|
|
Guid activityId;
|
|
Guid correlationId;
|
|
bool activityIdFound = ActivityIdHeader.ExtractActivityAndCorrelationId(message, out activityId, out correlationId);
|
|
if (TraceUtility.MessageFlowTracingOnly)
|
|
{
|
|
if (createNewActivityId)
|
|
{
|
|
if (!activityIdFound)
|
|
{
|
|
activityId = Guid.NewGuid();
|
|
activityIdFound = true;
|
|
}
|
|
//message flow tracing only - start fresh
|
|
DiagnosticTraceBase.ActivityId = Guid.Empty;
|
|
}
|
|
|
|
if (activityIdFound)
|
|
{
|
|
FxTrace.Trace.SetAndTraceTransfer(activityId, !createNewActivityId);
|
|
message.Properties[TraceUtility.E2EActivityId] = Trace.CorrelationManager.ActivityId;
|
|
}
|
|
}
|
|
if (TD.MessageReceivedFromTransportIsEnabled())
|
|
{
|
|
if (context == null)
|
|
{
|
|
context = OperationContext.Current;
|
|
}
|
|
|
|
TD.MessageReceivedFromTransport(eventTraceActivity, correlationId, TraceUtility.GetAnnotation(context));
|
|
}
|
|
}
|
|
}
|
|
|
|
internal static string GetAnnotation(OperationContext context)
|
|
{
|
|
object hostReference;
|
|
if (context != null && null != context.IncomingMessage && (MessageState.Closed != context.IncomingMessage.State))
|
|
{
|
|
if (!context.IncomingMessageProperties.TryGetValue(TraceApplicationReference, out hostReference))
|
|
{
|
|
hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(context.Host);
|
|
context.IncomingMessageProperties.Add(TraceApplicationReference, hostReference);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hostReference = AspNetEnvironment.Current.GetAnnotationFromHost(null);
|
|
}
|
|
return (string)hostReference;
|
|
}
|
|
|
|
internal static void TransferFromTransport(Message message)
|
|
{
|
|
if (message != null && DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
Guid guid = Guid.Empty;
|
|
|
|
// Only look if we are allowing user propagation
|
|
if (TraceUtility.ShouldPropagateActivity)
|
|
{
|
|
guid = ActivityIdHeader.ExtractActivityId(message);
|
|
}
|
|
|
|
if (guid == Guid.Empty)
|
|
{
|
|
guid = Guid.NewGuid();
|
|
}
|
|
|
|
ServiceModelActivity activity = null;
|
|
bool emitStart = true;
|
|
if (ServiceModelActivity.Current != null)
|
|
{
|
|
if ((ServiceModelActivity.Current.Id == guid) ||
|
|
(ServiceModelActivity.Current.ActivityType == ActivityType.ProcessAction))
|
|
{
|
|
activity = ServiceModelActivity.Current;
|
|
emitStart = false;
|
|
}
|
|
else if (ServiceModelActivity.Current.PreviousActivity != null &&
|
|
ServiceModelActivity.Current.PreviousActivity.Id == guid)
|
|
{
|
|
activity = ServiceModelActivity.Current.PreviousActivity;
|
|
emitStart = false;
|
|
}
|
|
}
|
|
|
|
if (activity == null)
|
|
{
|
|
activity = ServiceModelActivity.CreateActivity(guid);
|
|
}
|
|
if (DiagnosticUtility.ShouldUseActivity)
|
|
{
|
|
if (emitStart)
|
|
{
|
|
if (null != FxTrace.Trace)
|
|
{
|
|
FxTrace.Trace.TraceTransfer(guid);
|
|
}
|
|
ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityProcessAction, message.Headers.Action), ActivityType.ProcessAction);
|
|
}
|
|
}
|
|
message.Properties[TraceUtility.ActivityIdKey] = activity;
|
|
}
|
|
}
|
|
|
|
static internal void UpdateAsyncOperationContextWithActivity(object activity)
|
|
{
|
|
if (OperationContext.Current != null && activity != null)
|
|
{
|
|
OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationActivityKey] = activity;
|
|
}
|
|
}
|
|
|
|
static internal object ExtractAsyncOperationContextActivity()
|
|
{
|
|
object data = null;
|
|
if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue(TraceUtility.AsyncOperationActivityKey, out data))
|
|
{
|
|
OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationActivityKey);
|
|
}
|
|
return data;
|
|
}
|
|
|
|
static internal void UpdateAsyncOperationContextWithStartTime(EventTraceActivity eventTraceActivity, long startTime)
|
|
{
|
|
if (OperationContext.Current != null)
|
|
{
|
|
OperationContext.Current.OutgoingMessageProperties[TraceUtility.AsyncOperationStartTimeKey] = new EventTraceActivityTimeProperty(eventTraceActivity, startTime);
|
|
}
|
|
}
|
|
|
|
static internal void ExtractAsyncOperationStartTime(out EventTraceActivity eventTraceActivity, out long startTime)
|
|
{
|
|
EventTraceActivityTimeProperty data = null;
|
|
eventTraceActivity = null;
|
|
startTime = 0;
|
|
if (OperationContext.Current != null && OperationContext.Current.OutgoingMessageProperties.TryGetValue<EventTraceActivityTimeProperty>(TraceUtility.AsyncOperationStartTimeKey, out data))
|
|
{
|
|
OperationContext.Current.OutgoingMessageProperties.Remove(TraceUtility.AsyncOperationStartTimeKey);
|
|
eventTraceActivity = data.EventTraceActivity;
|
|
startTime = data.StartTime;
|
|
}
|
|
}
|
|
|
|
internal class TracingAsyncCallbackState
|
|
{
|
|
object innerState;
|
|
Guid activityId;
|
|
|
|
internal TracingAsyncCallbackState(object innerState)
|
|
{
|
|
this.innerState = innerState;
|
|
this.activityId = DiagnosticTraceBase.ActivityId;
|
|
}
|
|
|
|
internal object InnerState
|
|
{
|
|
get { return this.innerState; }
|
|
}
|
|
|
|
internal Guid ActivityId
|
|
{
|
|
get { return this.activityId; }
|
|
}
|
|
}
|
|
|
|
internal static AsyncCallback WrapExecuteUserCodeAsyncCallback(AsyncCallback callback)
|
|
{
|
|
return (DiagnosticUtility.ShouldUseActivity && callback != null) ?
|
|
(new ExecuteUserCodeAsync(callback)).Callback
|
|
: callback;
|
|
}
|
|
|
|
sealed class ExecuteUserCodeAsync
|
|
{
|
|
AsyncCallback callback;
|
|
|
|
public ExecuteUserCodeAsync(AsyncCallback callback)
|
|
{
|
|
this.callback = callback;
|
|
}
|
|
|
|
public AsyncCallback Callback
|
|
{
|
|
get
|
|
{
|
|
return Fx.ThunkCallback(new AsyncCallback(this.ExecuteUserCode));
|
|
}
|
|
}
|
|
|
|
void ExecuteUserCode(IAsyncResult result)
|
|
{
|
|
using (ServiceModelActivity activity = ServiceModelActivity.CreateBoundedActivity())
|
|
{
|
|
ServiceModelActivity.Start(activity, SR.GetString(SR.ActivityCallback), ActivityType.ExecuteUserCode);
|
|
this.callback(result);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
class EventTraceActivityTimeProperty
|
|
{
|
|
long startTime;
|
|
EventTraceActivity eventTraceActivity;
|
|
|
|
public EventTraceActivityTimeProperty(EventTraceActivity eventTraceActivity, long startTime)
|
|
{
|
|
this.eventTraceActivity = eventTraceActivity;
|
|
this.startTime = startTime;
|
|
}
|
|
|
|
internal long StartTime
|
|
{
|
|
get { return this.startTime; }
|
|
}
|
|
internal EventTraceActivity EventTraceActivity
|
|
{
|
|
get { return this.eventTraceActivity; }
|
|
}
|
|
}
|
|
|
|
|
|
internal static string GetRemoteEndpointAddressPort(Net.IPEndPoint iPEndPoint)
|
|
{
|
|
//We really don't want any exceptions out of TraceUtility.
|
|
if (iPEndPoint != null)
|
|
{
|
|
try
|
|
{
|
|
return iPEndPoint.Address.ToString() + ":" + iPEndPoint.Port;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
if (Fx.IsFatal(exception))
|
|
{
|
|
throw;
|
|
}
|
|
//ignore and continue with all non-fatal exceptions.
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
internal static string GetRemoteEndpointAddressPort(RemoteEndpointMessageProperty remoteEndpointMessageProperty)
|
|
{
|
|
try
|
|
{
|
|
if (remoteEndpointMessageProperty != null)
|
|
{
|
|
return remoteEndpointMessageProperty.Address + ":" + remoteEndpointMessageProperty.Port;
|
|
}
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
if (Fx.IsFatal(exception))
|
|
{
|
|
throw;
|
|
}
|
|
//ignore and continue with all non-fatal exceptions.
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
}
|
|
}
|