108 lines
3.6 KiB
C#
108 lines
3.6 KiB
C#
|
// <copyright>
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|