AppDomainInstanceProvider.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Administration
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics;
  9. using System.Globalization;
  10. using System.Reflection;
  11. using System.Runtime;
  12. using System.ServiceModel;
  13. using System.ServiceModel.Diagnostics;
  14. using System.ServiceModel.Activation;
  15. using System.Security;
  16. using System.Security.Permissions;
  17. class AppDomainInstanceProvider : ProviderBase, IWmiProvider
  18. {
  19. void IWmiProvider.EnumInstances(IWmiInstances instances)
  20. {
  21. Fx.Assert(null != instances, "");
  22. IWmiInstance instance = instances.NewInstance(null);
  23. FillAppDomainInfo(instance);
  24. instances.AddInstance(instance);
  25. }
  26. bool IWmiProvider.GetInstance(IWmiInstance instance)
  27. {
  28. Fx.Assert(null != instance, "");
  29. bool bFound = false;
  30. if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
  31. && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal))
  32. {
  33. FillAppDomainInfo(instance);
  34. bFound = true;
  35. }
  36. return bFound;
  37. }
  38. internal static string GetReference()
  39. {
  40. return String.Format(CultureInfo.InvariantCulture, AdministrationStrings.AppDomainInfo +
  41. "." +
  42. AdministrationStrings.AppDomainId +
  43. "={0}," +
  44. AdministrationStrings.Name +
  45. "='{1}'," +
  46. AdministrationStrings.ProcessId +
  47. "={2}",
  48. AppDomainInfo.Current.Id,
  49. AppDomainInfo.Current.Name,
  50. AppDomainInfo.Current.ProcessId);
  51. }
  52. internal static void FillAppDomainInfo(IWmiInstance instance)
  53. {
  54. Fx.Assert(null != instance, "");
  55. AppDomainInfo domainInfo = AppDomainInfo.Current;
  56. instance.SetProperty(AdministrationStrings.Name, domainInfo.Name);
  57. instance.SetProperty(AdministrationStrings.AppDomainId, domainInfo.Id);
  58. instance.SetProperty(AdministrationStrings.PerformanceCounters, PerformanceCounters.Scope.ToString());
  59. instance.SetProperty(AdministrationStrings.IsDefault, domainInfo.IsDefaultAppDomain);
  60. instance.SetProperty(AdministrationStrings.ProcessId, domainInfo.ProcessId);
  61. instance.SetProperty(AdministrationStrings.TraceLevel, DiagnosticUtility.Level.ToString());
  62. instance.SetProperty(AdministrationStrings.LogMalformedMessages, MessageLogger.LogMalformedMessages);
  63. instance.SetProperty(AdministrationStrings.LogMessagesAtServiceLevel, MessageLogger.LogMessagesAtServiceLevel);
  64. instance.SetProperty(AdministrationStrings.LogMessagesAtTransportLevel, MessageLogger.LogMessagesAtTransportLevel);
  65. instance.SetProperty(AdministrationStrings.ServiceConfigPath, AspNetEnvironment.Current.ConfigurationPath);
  66. FillListenersInfo(instance);
  67. }
  68. static IWmiInstance[] CreateListenersInfo(TraceSource traceSource, IWmiInstance instance)
  69. {
  70. Fx.Assert(null != traceSource, "");
  71. Fx.Assert(null != instance, "");
  72. IWmiInstance[] traceListeners = new IWmiInstance[traceSource.Listeners.Count];
  73. for (int i = 0; i < traceSource.Listeners.Count; i++)
  74. {
  75. TraceListener traceListener = traceSource.Listeners[i];
  76. IWmiInstance traceListenerWmiInstance = instance.NewInstance(AdministrationStrings.TraceListener);
  77. traceListenerWmiInstance.SetProperty(AdministrationStrings.Name, traceListener.Name);
  78. List<IWmiInstance> traceListenerArguments = new List<IWmiInstance>(1);
  79. Type type = traceListener.GetType();
  80. string initializeData = (string)type.InvokeMember(AdministrationStrings.InitializeData, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture);
  81. string[] supportedAttributes = (string[])type.InvokeMember(AdministrationStrings.GetSupportedAttributes, BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture);
  82. IWmiInstance argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument);
  83. argumentWmiInstance.SetProperty(AdministrationStrings.Name, AdministrationStrings.InitializeData);
  84. argumentWmiInstance.SetProperty(AdministrationStrings.Value, initializeData);
  85. traceListenerArguments.Add(argumentWmiInstance);
  86. if (null != supportedAttributes)
  87. {
  88. foreach (string attribute in supportedAttributes)
  89. {
  90. argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument);
  91. argumentWmiInstance.SetProperty(AdministrationStrings.Name, attribute);
  92. argumentWmiInstance.SetProperty(AdministrationStrings.Value, traceListener.Attributes[attribute]);
  93. traceListenerArguments.Add(argumentWmiInstance);
  94. }
  95. }
  96. traceListenerWmiInstance.SetProperty(AdministrationStrings.TraceListenerArguments, traceListenerArguments.ToArray());
  97. traceListeners[i] = traceListenerWmiInstance;
  98. }
  99. return traceListeners;
  100. }
  101. static void FillListenersInfo(IWmiInstance instance)
  102. {
  103. Fx.Assert(null != instance, "");
  104. TraceSource traceSource = DiagnosticUtility.DiagnosticTrace == null ? null : DiagnosticUtility.DiagnosticTrace.TraceSource;
  105. if (null != traceSource)
  106. {
  107. instance.SetProperty(AdministrationStrings.ServiceModelTraceListeners, CreateListenersInfo(traceSource, instance));
  108. }
  109. traceSource = MessageLogger.MessageTraceSource;
  110. if (null != traceSource)
  111. {
  112. instance.SetProperty(AdministrationStrings.MessageLoggingTraceListeners, CreateListenersInfo(traceSource, instance));
  113. }
  114. }
  115. [Fx.Tag.SecurityNote(Critical = "Critical because we are setting DiagnosticUtility.Level.",
  116. Safe = "Demands UnmanagedCode permission to set the Trace level")]
  117. [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  118. [SecuritySafeCritical]
  119. bool IWmiProvider.PutInstance(IWmiInstance instance)
  120. {
  121. Fx.Assert(null != instance, "");
  122. bool bFound = false;
  123. if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
  124. && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal))
  125. {
  126. try
  127. {
  128. SourceLevels newLevel = (SourceLevels)Enum.Parse(typeof(SourceLevels), (string)instance.GetProperty(AdministrationStrings.TraceLevel));
  129. if (DiagnosticUtility.Level != newLevel)
  130. {
  131. if (DiagnosticUtility.ShouldTraceVerbose)
  132. {
  133. TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
  134. new WmiPutTraceRecord("DiagnosticTrace.Level",
  135. DiagnosticUtility.Level,
  136. newLevel), instance, null);
  137. }
  138. DiagnosticUtility.Level = newLevel;
  139. }
  140. bool logMalformedMessages = (bool)instance.GetProperty(AdministrationStrings.LogMalformedMessages);
  141. if (MessageLogger.LogMalformedMessages != logMalformedMessages)
  142. {
  143. if (DiagnosticUtility.ShouldTraceVerbose)
  144. {
  145. TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
  146. new WmiPutTraceRecord("MessageLogger.LogMalformedMessages",
  147. MessageLogger.LogMalformedMessages,
  148. logMalformedMessages), instance, null);
  149. }
  150. MessageLogger.LogMalformedMessages = logMalformedMessages;
  151. }
  152. bool logMessagesAtServiceLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtServiceLevel);
  153. if (MessageLogger.LogMessagesAtServiceLevel != logMessagesAtServiceLevel)
  154. {
  155. if (DiagnosticUtility.ShouldTraceVerbose)
  156. {
  157. TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
  158. new WmiPutTraceRecord("MessageLogger.LogMessagesAtServiceLevel",
  159. MessageLogger.LogMessagesAtServiceLevel,
  160. logMessagesAtServiceLevel), instance, null);
  161. }
  162. MessageLogger.LogMessagesAtServiceLevel = logMessagesAtServiceLevel;
  163. }
  164. bool logMessagesAtTransportLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtTransportLevel);
  165. if (MessageLogger.LogMessagesAtTransportLevel != logMessagesAtTransportLevel)
  166. {
  167. if (DiagnosticUtility.ShouldTraceVerbose)
  168. {
  169. TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
  170. new WmiPutTraceRecord("MessageLogger.LogMessagesAtTransportLevel",
  171. MessageLogger.LogMessagesAtTransportLevel,
  172. logMessagesAtTransportLevel), instance, null);
  173. }
  174. MessageLogger.LogMessagesAtTransportLevel = logMessagesAtTransportLevel;
  175. }
  176. }
  177. catch (ArgumentException)
  178. {
  179. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new WbemInvalidParameterException());
  180. }
  181. bFound = true;
  182. }
  183. return bFound;
  184. }
  185. }
  186. }