ActivityIdHeader.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Diagnostics
  5. {
  6. using System;
  7. using System.Diagnostics;
  8. using System.Runtime;
  9. using System.ServiceModel.Channels;
  10. using System.Xml;
  11. class ActivityIdHeader : DictionaryHeader
  12. {
  13. Guid guid;
  14. Guid headerId;
  15. internal ActivityIdHeader(Guid activityId)
  16. : base()
  17. {
  18. this.guid = activityId;
  19. this.headerId = Guid.NewGuid();
  20. }
  21. public override XmlDictionaryString DictionaryName
  22. {
  23. get { return XD.ActivityIdFlowDictionary.ActivityId; }
  24. }
  25. public override XmlDictionaryString DictionaryNamespace
  26. {
  27. get { return XD.ActivityIdFlowDictionary.ActivityIdNamespace; }
  28. }
  29. internal static Guid ExtractActivityId(Message message)
  30. {
  31. Guid guid = Guid.Empty;
  32. try
  33. {
  34. if (message != null && message.State != MessageState.Closed && message.Headers != null)
  35. {
  36. int index = message.Headers.FindHeader(DiagnosticStrings.ActivityId, DiagnosticStrings.DiagnosticsNamespace);
  37. // Check the state again, in case the message was closed after we found the header
  38. if (index >= 0)
  39. {
  40. using (XmlDictionaryReader reader = message.Headers.GetReaderAtHeader(index))
  41. {
  42. guid = reader.ReadElementContentAsGuid();
  43. }
  44. }
  45. }
  46. }
  47. #pragma warning suppress 56500 // covered by FxCOP
  48. catch (Exception e)
  49. {
  50. if (Fx.IsFatal(e))
  51. {
  52. throw;
  53. }
  54. if (DiagnosticUtility.ShouldTraceError)
  55. {
  56. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToReadAnActivityIdHeader,
  57. SR.GetString(SR.TraceCodeFailedToReadAnActivityIdHeader), null, e);
  58. }
  59. }
  60. return guid;
  61. }
  62. internal static bool ExtractActivityAndCorrelationId(Message message, out Guid activityId, out Guid correlationId)
  63. {
  64. if (message == null)
  65. {
  66. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
  67. }
  68. activityId = Guid.Empty;
  69. correlationId = Guid.Empty;
  70. try
  71. {
  72. if (message.State != MessageState.Closed && message.Headers != null)
  73. {
  74. int index = message.Headers.FindHeader(DiagnosticStrings.ActivityId, DiagnosticStrings.DiagnosticsNamespace);
  75. // Check the state again, in case the message was closed after we found the header
  76. if (index >= 0)
  77. {
  78. using (XmlDictionaryReader reader = message.Headers.GetReaderAtHeader(index))
  79. {
  80. correlationId = Fx.CreateGuid(reader.GetAttribute("CorrelationId", null));
  81. activityId = reader.ReadElementContentAsGuid();
  82. return activityId != Guid.Empty;
  83. }
  84. }
  85. }
  86. }
  87. #pragma warning suppress 56500 // covered by FxCOP
  88. catch (Exception e)
  89. {
  90. if (Fx.IsFatal(e))
  91. {
  92. throw;
  93. }
  94. if (DiagnosticUtility.ShouldTraceError)
  95. {
  96. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.FailedToReadAnActivityIdHeader,
  97. SR.GetString(SR.TraceCodeFailedToReadAnActivityIdHeader), null, e);
  98. }
  99. }
  100. return false;
  101. }
  102. internal void AddTo(Message message)
  103. {
  104. if (message == null)
  105. {
  106. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
  107. }
  108. if (message.State != MessageState.Closed && message.Headers.MessageVersion.Envelope != EnvelopeVersion.None)
  109. {
  110. int index = message.Headers.FindHeader(DiagnosticStrings.ActivityId, DiagnosticStrings.DiagnosticsNamespace);
  111. if (index < 0)
  112. {
  113. message.Headers.Add(this);
  114. }
  115. }
  116. }
  117. protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
  118. {
  119. if (writer == null)
  120. {
  121. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer");
  122. }
  123. writer.WriteAttributeString("CorrelationId", this.headerId.ToString());
  124. writer.WriteValue(this.guid);
  125. }
  126. }
  127. }