// // Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.ServiceModel.Diagnostics { using System; using System.Diagnostics; using System.Runtime; using System.Runtime.Diagnostics; using System.Security; using System.Security.Permissions; using System.ServiceModel.Channels; using System.Xml; internal static class EventTraceActivityHelper { public static bool TryAttachActivity(Message message, EventTraceActivity activity) { if (FxTrace.Trace.IsEnd2EndActivityTracingEnabled && (message != null) && (activity != null)) { if (!message.Properties.ContainsKey(EventTraceActivity.Name)) { message.Properties.Add(EventTraceActivity.Name, activity); return true; } } return false; } public static EventTraceActivity TryExtractActivity(Message message) { return TryExtractActivity(message, false); } public static EventTraceActivity TryExtractActivity(Message message, bool createIfNotExist) { EventTraceActivity eventTraceActivity = null; if (message != null && message.State != MessageState.Closed) { object property; if (message.Properties.TryGetValue(EventTraceActivity.Name, out property)) { eventTraceActivity = property as EventTraceActivity; } if (eventTraceActivity == null) { Guid activityId; if (GetMessageId(message, out activityId)) { eventTraceActivity = new EventTraceActivity(activityId); } else { UniqueId uid = message.Headers.RelatesTo; if (uid != null) { if (uid.TryGetGuid(out activityId)) { eventTraceActivity = new EventTraceActivity(activityId); } } } if (eventTraceActivity == null && createIfNotExist) { eventTraceActivity = new EventTraceActivity(); } if (eventTraceActivity != null) { // Attach the trace activity to the message message.Properties[EventTraceActivity.Name] = eventTraceActivity; } } } return eventTraceActivity; } [Fx.Tag.SecurityNote(Critical = "This sets the ActivityId on the thread. Must not be settable from PT code unless from safe context.")] [SecurityCritical] [SecurityPermission(SecurityAction.Assert, Unrestricted = true)] internal static void SetOnThread(EventTraceActivity eventTraceActivity) { if (eventTraceActivity != null) { Trace.CorrelationManager.ActivityId = eventTraceActivity.ActivityId; } } private static bool GetMessageId(Message message, out Guid guid) { UniqueId uniqueId = message.Headers.MessageId; if (uniqueId == null) { guid = Guid.Empty; return false; } return uniqueId.TryGetGuid(out guid); } } }