Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Web / System / Web / Services / Diagnostics / TraceUtility.cs / 1305376 / TraceUtility.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Services.Diagnostics { using System.Threading; using System.Net; using System.Diagnostics; using System.IO; using System.Text; using System.Globalization; using System.Xml.Serialization; using System.Web.Services; using System.Web.Services.Protocols; using System.Collections.Generic; internal static class Tracing { private static bool tracingEnabled = true; private static bool tracingInitialized; private static bool appDomainShutdown; private const string TraceSourceAsmx = "System.Web.Services.Asmx"; private static TraceSource asmxTraceSource; private static object internalSyncObject; private static object InternalSyncObject { get { if (internalSyncObject == null) { object o = new Object(); Interlocked.CompareExchange(ref internalSyncObject, o, null); } return internalSyncObject; } } internal static bool On { get { if (!tracingInitialized) { InitializeLogging(); } return tracingEnabled; } } internal static bool IsVerbose { get { return ValidateSettings(Asmx, TraceEventType.Verbose); } } internal static TraceSource Asmx { get { if (!tracingInitialized) InitializeLogging(); if (!tracingEnabled) return null; return asmxTraceSource; } } ////// private static void InitializeLogging() { lock (InternalSyncObject) { if (!tracingInitialized) { bool loggingEnabled = false; asmxTraceSource = new TraceSource(TraceSourceAsmx); if (asmxTraceSource.Switch.ShouldTrace(TraceEventType.Critical)) { loggingEnabled = true; AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler); currentDomain.DomainUnload += new EventHandler(AppDomainUnloadEvent); currentDomain.ProcessExit += new EventHandler(ProcessExitEvent); } tracingEnabled = loggingEnabled; tracingInitialized = true; } } } private static void Close() { if (asmxTraceSource != null) { asmxTraceSource.Close(); } } ///Sets up internal config settings for logging. (MUST be called under critsec) ////// private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) { Exception e = (Exception)args.ExceptionObject; ExceptionCatch(TraceEventType.Error, sender, "UnhandledExceptionHandler", e); } private static void ProcessExitEvent(object sender, EventArgs e) { Close(); appDomainShutdown = true; } ///Logs any unhandled exception through this event handler ////// private static void AppDomainUnloadEvent(object sender, EventArgs e) { Close(); appDomainShutdown = true; } ///Called when the system is shutting down, used to prevent additional logging post-shutdown ////// private static bool ValidateSettings(TraceSource traceSource, TraceEventType traceLevel) { if (!tracingEnabled) { return false; } if (!tracingInitialized) { InitializeLogging(); } if (traceSource == null || !traceSource.Switch.ShouldTrace(traceLevel)) { return false; } if (appDomainShutdown) { return false; } return true; } internal static void Information(string format, params object[] args) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; TraceEvent(TraceEventType.Information, Res.GetString( format, args)); } static void TraceEvent(TraceEventType eventType, string format) { Asmx.TraceEvent(eventType, 0, format); } internal static Exception ExceptionThrow(TraceMethod method, Exception e) { return ExceptionThrow(TraceEventType.Error, method, e); } internal static Exception ExceptionThrow(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionThrown, method.ToString(), e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionCatch(TraceMethod method, Exception e) { return ExceptionCatch(TraceEventType.Error, method, e); } internal static Exception ExceptionCatch(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionCought, method, e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionCatch(TraceEventType eventType, object target, string method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionCought, TraceMethod.MethodId(target, method), e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionIgnore(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionIgnored, method, e.GetType(), e.Message)); StackTrace(eventType, e); return e; } static void StackTrace(TraceEventType eventType, Exception e) { if (IsVerbose && !string.IsNullOrEmpty(e.StackTrace)) { TraceEvent(eventType, Res.GetString(Res.TraceExceptionDetails, e.ToString())); } } internal static string TraceId(string id) { return Res.GetString(id); } static string GetHostByAddress(string ipAddress) { try { return Dns.GetHostByAddress(ipAddress).HostName; } catch { return null; } } internal static ListConfirms logging is enabled, given current logging settings ///Details(HttpRequest request) { if (request == null) return null; List requestDetails = null; requestDetails = new List (); requestDetails.Add(Res.GetString(Res.TraceUserHostAddress, request.UserHostAddress)); string hostName = request.UserHostAddress == request.UserHostName ? GetHostByAddress(request.UserHostAddress) : request.UserHostName; if (!string.IsNullOrEmpty(hostName)) requestDetails.Add(Res.GetString(Res.TraceUserHostName, hostName)); requestDetails.Add(Res.GetString(Res.TraceUrl, request.HttpMethod, request.Url)); if (request.UrlReferrer != null) requestDetails.Add(Res.GetString(Res.TraceUrlReferrer, request.UrlReferrer)); return requestDetails; } internal static void Enter(string callId, TraceMethod caller) { Enter(callId, caller, null, null); } internal static void Enter(string callId, TraceMethod caller, List details) { Enter(callId, caller, null, details); } internal static void Enter(string callId, TraceMethod caller, TraceMethod callDetails) { Enter(callId, caller, callDetails, null); } internal static void Enter(string callId, TraceMethod caller, TraceMethod callDetails, List details) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; string trace = callDetails == null ? Res.GetString(Res.TraceCallEnter, callId, caller) : Res.GetString(Res.TraceCallEnterDetails, callId, caller, callDetails); if (details != null && details.Count > 0) { StringBuilder sb = new StringBuilder(trace); foreach (string detail in details) { sb.Append(Environment.NewLine); sb.Append(" "); sb.Append(detail); } trace = sb.ToString(); } TraceEvent(TraceEventType.Information, trace); } internal static XmlDeserializationEvents GetDeserializationEvents() { XmlDeserializationEvents events = new XmlDeserializationEvents(); events.OnUnknownElement = new XmlElementEventHandler(OnUnknownElement); events.OnUnknownAttribute = new XmlAttributeEventHandler(OnUnknownAttribute); return events; } internal static void Exit(string callId, TraceMethod caller) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; TraceEvent(TraceEventType.Information, Res.GetString(Res.TraceCallExit, callId, caller)); } internal static void OnUnknownElement(object sender, XmlElementEventArgs e) { if (!ValidateSettings(Asmx, TraceEventType.Warning)) return; if (e.Element == null) return; string xml = RuntimeUtils.ElementString(e.Element); string format = e.ExpectedElements == null ? Res.WebUnknownElement : e.ExpectedElements.Length == 0 ? Res.WebUnknownElement1 : Res.WebUnknownElement2; TraceEvent(TraceEventType.Warning, Res.GetString(format, xml, e.ExpectedElements)); } internal static void OnUnknownAttribute(object sender, XmlAttributeEventArgs e) { if (!ValidateSettings(Asmx, TraceEventType.Warning)) return; if (e.Attr == null) return; // ignore attributes from known namepsaces if (RuntimeUtils.IsKnownNamespace(e.Attr.NamespaceURI)) return; string format = e.ExpectedAttributes == null ? Res.WebUnknownAttribute : e.ExpectedAttributes.Length == 0 ? Res.WebUnknownAttribute2 : Res.WebUnknownAttribute3; TraceEvent(TraceEventType.Warning, Res.GetString(format, e.Attr.Name, e.Attr.Value, e.ExpectedAttributes)); } } internal class TraceMethod { object target; string name; object[] args; string call; internal TraceMethod(object target, string name, params object[] args) { this.target = target; this.name = name; this.args = args; } public override string ToString() { if (call == null) call = CallString(this.target, this.name, this.args); return call; } internal static string CallString(object target, string method, params object[] args) { StringBuilder sb = new StringBuilder(); WriteObjectId(sb, target); sb.Append(':'); sb.Append(':'); sb.Append(method); sb.Append('('); for (int i = 0; i < args.Length; i++) { object o = args[i]; WriteObjectId(sb, o); if (o != null) { sb.Append('='); WriteValue(sb, o); } if (i + 1 < args.Length) { sb.Append(','); sb.Append(' '); } } sb.Append(')'); return sb.ToString(); } internal static string MethodId(object target, string method) { StringBuilder sb = new StringBuilder(); WriteObjectId(sb, target); sb.Append(':'); sb.Append(':'); sb.Append(method); return sb.ToString(); } static void WriteObjectId(StringBuilder sb, object o) { if (o == null) { sb.Append("(null)"); } else if (o is Type) { Type type = (Type)o; sb.Append(type.FullName); if (!(type.IsAbstract && type.IsSealed)) { sb.Append('#'); sb.Append(HashString(o)); } } else { sb.Append(o.GetType().FullName); sb.Append('#'); sb.Append(HashString(o)); } } static void WriteValue(StringBuilder sb, object o) { if (o == null) { return; } if (o is string) { sb.Append('"'); sb.Append(o); sb.Append('"'); } else { Type type = o.GetType(); if (type.IsArray) { sb.Append('['); sb.Append(((Array)o).Length); sb.Append(']'); } else { string value = o.ToString(); if (type.FullName == value) { sb.Append('.'); sb.Append('.'); } else { sb.Append(value); } } } } static string HashString(object objectValue) { if (objectValue == null) { return "(null)"; } else { return objectValue.GetHashCode().ToString(NumberFormatInfo.InvariantInfo); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Services.Diagnostics { using System.Threading; using System.Net; using System.Diagnostics; using System.IO; using System.Text; using System.Globalization; using System.Xml.Serialization; using System.Web.Services; using System.Web.Services.Protocols; using System.Collections.Generic; internal static class Tracing { private static bool tracingEnabled = true; private static bool tracingInitialized; private static bool appDomainShutdown; private const string TraceSourceAsmx = "System.Web.Services.Asmx"; private static TraceSource asmxTraceSource; private static object internalSyncObject; private static object InternalSyncObject { get { if (internalSyncObject == null) { object o = new Object(); Interlocked.CompareExchange(ref internalSyncObject, o, null); } return internalSyncObject; } } internal static bool On { get { if (!tracingInitialized) { InitializeLogging(); } return tracingEnabled; } } internal static bool IsVerbose { get { return ValidateSettings(Asmx, TraceEventType.Verbose); } } internal static TraceSource Asmx { get { if (!tracingInitialized) InitializeLogging(); if (!tracingEnabled) return null; return asmxTraceSource; } } ////// private static void InitializeLogging() { lock (InternalSyncObject) { if (!tracingInitialized) { bool loggingEnabled = false; asmxTraceSource = new TraceSource(TraceSourceAsmx); if (asmxTraceSource.Switch.ShouldTrace(TraceEventType.Critical)) { loggingEnabled = true; AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler); currentDomain.DomainUnload += new EventHandler(AppDomainUnloadEvent); currentDomain.ProcessExit += new EventHandler(ProcessExitEvent); } tracingEnabled = loggingEnabled; tracingInitialized = true; } } } private static void Close() { if (asmxTraceSource != null) { asmxTraceSource.Close(); } } ///Sets up internal config settings for logging. (MUST be called under critsec) ////// private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) { Exception e = (Exception)args.ExceptionObject; ExceptionCatch(TraceEventType.Error, sender, "UnhandledExceptionHandler", e); } private static void ProcessExitEvent(object sender, EventArgs e) { Close(); appDomainShutdown = true; } ///Logs any unhandled exception through this event handler ////// private static void AppDomainUnloadEvent(object sender, EventArgs e) { Close(); appDomainShutdown = true; } ///Called when the system is shutting down, used to prevent additional logging post-shutdown ////// private static bool ValidateSettings(TraceSource traceSource, TraceEventType traceLevel) { if (!tracingEnabled) { return false; } if (!tracingInitialized) { InitializeLogging(); } if (traceSource == null || !traceSource.Switch.ShouldTrace(traceLevel)) { return false; } if (appDomainShutdown) { return false; } return true; } internal static void Information(string format, params object[] args) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; TraceEvent(TraceEventType.Information, Res.GetString( format, args)); } static void TraceEvent(TraceEventType eventType, string format) { Asmx.TraceEvent(eventType, 0, format); } internal static Exception ExceptionThrow(TraceMethod method, Exception e) { return ExceptionThrow(TraceEventType.Error, method, e); } internal static Exception ExceptionThrow(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionThrown, method.ToString(), e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionCatch(TraceMethod method, Exception e) { return ExceptionCatch(TraceEventType.Error, method, e); } internal static Exception ExceptionCatch(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionCought, method, e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionCatch(TraceEventType eventType, object target, string method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionCought, TraceMethod.MethodId(target, method), e.GetType(), e.Message)); StackTrace(eventType, e); return e; } internal static Exception ExceptionIgnore(TraceEventType eventType, TraceMethod method, Exception e) { if (!ValidateSettings(Asmx, eventType)) return e; TraceEvent(eventType, Res.GetString(Res.TraceExceptionIgnored, method, e.GetType(), e.Message)); StackTrace(eventType, e); return e; } static void StackTrace(TraceEventType eventType, Exception e) { if (IsVerbose && !string.IsNullOrEmpty(e.StackTrace)) { TraceEvent(eventType, Res.GetString(Res.TraceExceptionDetails, e.ToString())); } } internal static string TraceId(string id) { return Res.GetString(id); } static string GetHostByAddress(string ipAddress) { try { return Dns.GetHostByAddress(ipAddress).HostName; } catch { return null; } } internal static ListConfirms logging is enabled, given current logging settings ///Details(HttpRequest request) { if (request == null) return null; List requestDetails = null; requestDetails = new List (); requestDetails.Add(Res.GetString(Res.TraceUserHostAddress, request.UserHostAddress)); string hostName = request.UserHostAddress == request.UserHostName ? GetHostByAddress(request.UserHostAddress) : request.UserHostName; if (!string.IsNullOrEmpty(hostName)) requestDetails.Add(Res.GetString(Res.TraceUserHostName, hostName)); requestDetails.Add(Res.GetString(Res.TraceUrl, request.HttpMethod, request.Url)); if (request.UrlReferrer != null) requestDetails.Add(Res.GetString(Res.TraceUrlReferrer, request.UrlReferrer)); return requestDetails; } internal static void Enter(string callId, TraceMethod caller) { Enter(callId, caller, null, null); } internal static void Enter(string callId, TraceMethod caller, List details) { Enter(callId, caller, null, details); } internal static void Enter(string callId, TraceMethod caller, TraceMethod callDetails) { Enter(callId, caller, callDetails, null); } internal static void Enter(string callId, TraceMethod caller, TraceMethod callDetails, List details) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; string trace = callDetails == null ? Res.GetString(Res.TraceCallEnter, callId, caller) : Res.GetString(Res.TraceCallEnterDetails, callId, caller, callDetails); if (details != null && details.Count > 0) { StringBuilder sb = new StringBuilder(trace); foreach (string detail in details) { sb.Append(Environment.NewLine); sb.Append(" "); sb.Append(detail); } trace = sb.ToString(); } TraceEvent(TraceEventType.Information, trace); } internal static XmlDeserializationEvents GetDeserializationEvents() { XmlDeserializationEvents events = new XmlDeserializationEvents(); events.OnUnknownElement = new XmlElementEventHandler(OnUnknownElement); events.OnUnknownAttribute = new XmlAttributeEventHandler(OnUnknownAttribute); return events; } internal static void Exit(string callId, TraceMethod caller) { if (!ValidateSettings(Asmx, TraceEventType.Information)) return; TraceEvent(TraceEventType.Information, Res.GetString(Res.TraceCallExit, callId, caller)); } internal static void OnUnknownElement(object sender, XmlElementEventArgs e) { if (!ValidateSettings(Asmx, TraceEventType.Warning)) return; if (e.Element == null) return; string xml = RuntimeUtils.ElementString(e.Element); string format = e.ExpectedElements == null ? Res.WebUnknownElement : e.ExpectedElements.Length == 0 ? Res.WebUnknownElement1 : Res.WebUnknownElement2; TraceEvent(TraceEventType.Warning, Res.GetString(format, xml, e.ExpectedElements)); } internal static void OnUnknownAttribute(object sender, XmlAttributeEventArgs e) { if (!ValidateSettings(Asmx, TraceEventType.Warning)) return; if (e.Attr == null) return; // ignore attributes from known namepsaces if (RuntimeUtils.IsKnownNamespace(e.Attr.NamespaceURI)) return; string format = e.ExpectedAttributes == null ? Res.WebUnknownAttribute : e.ExpectedAttributes.Length == 0 ? Res.WebUnknownAttribute2 : Res.WebUnknownAttribute3; TraceEvent(TraceEventType.Warning, Res.GetString(format, e.Attr.Name, e.Attr.Value, e.ExpectedAttributes)); } } internal class TraceMethod { object target; string name; object[] args; string call; internal TraceMethod(object target, string name, params object[] args) { this.target = target; this.name = name; this.args = args; } public override string ToString() { if (call == null) call = CallString(this.target, this.name, this.args); return call; } internal static string CallString(object target, string method, params object[] args) { StringBuilder sb = new StringBuilder(); WriteObjectId(sb, target); sb.Append(':'); sb.Append(':'); sb.Append(method); sb.Append('('); for (int i = 0; i < args.Length; i++) { object o = args[i]; WriteObjectId(sb, o); if (o != null) { sb.Append('='); WriteValue(sb, o); } if (i + 1 < args.Length) { sb.Append(','); sb.Append(' '); } } sb.Append(')'); return sb.ToString(); } internal static string MethodId(object target, string method) { StringBuilder sb = new StringBuilder(); WriteObjectId(sb, target); sb.Append(':'); sb.Append(':'); sb.Append(method); return sb.ToString(); } static void WriteObjectId(StringBuilder sb, object o) { if (o == null) { sb.Append("(null)"); } else if (o is Type) { Type type = (Type)o; sb.Append(type.FullName); if (!(type.IsAbstract && type.IsSealed)) { sb.Append('#'); sb.Append(HashString(o)); } } else { sb.Append(o.GetType().FullName); sb.Append('#'); sb.Append(HashString(o)); } } static void WriteValue(StringBuilder sb, object o) { if (o == null) { return; } if (o is string) { sb.Append('"'); sb.Append(o); sb.Append('"'); } else { Type type = o.GetType(); if (type.IsArray) { sb.Append('['); sb.Append(((Array)o).Length); sb.Append(']'); } else { string value = o.ToString(); if (type.FullName == value) { sb.Append('.'); sb.Append('.'); } else { sb.Append(value); } } } } static string HashString(object objectValue) { if (objectValue == null) { return "(null)"; } else { return objectValue.GetHashCode().ToString(NumberFormatInfo.InvariantInfo); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- cookiecontainer.cs
- PropertyItem.cs
- Application.cs
- DataGridTable.cs
- __FastResourceComparer.cs
- XmlElementAttributes.cs
- PageCodeDomTreeGenerator.cs
- TableProviderWrapper.cs
- Root.cs
- LinkLabel.cs
- ConvertTextFrag.cs
- QuerySafeNavigator.cs
- DecoderFallback.cs
- PenContexts.cs
- WorkerRequest.cs
- BuildProviderCollection.cs
- Variant.cs
- JsonDeserializer.cs
- GetPageNumberCompletedEventArgs.cs
- SafeIUnknown.cs
- SerializerDescriptor.cs
- PingOptions.cs
- Constraint.cs
- CompiledQuery.cs
- EncryptedType.cs
- DataColumn.cs
- PipelineModuleStepContainer.cs
- DesignParameter.cs
- XamlVector3DCollectionSerializer.cs
- ColumnWidthChangingEvent.cs
- _DigestClient.cs
- ContextMarshalException.cs
- UTF7Encoding.cs
- AutoResetEvent.cs
- XmlUtilWriter.cs
- SupportingTokenBindingElement.cs
- SiteMapProvider.cs
- XmlSortKey.cs
- WebPartConnectionsEventArgs.cs
- SafeProcessHandle.cs
- QilInvoke.cs
- SQLSingle.cs
- DataGridViewRowsAddedEventArgs.cs
- SamlAuthorizationDecisionClaimResource.cs
- TextEditor.cs
- CodeValidator.cs
- Scheduler.cs
- DataBindingList.cs
- TableLayoutCellPaintEventArgs.cs
- XPathDocumentNavigator.cs
- IndicCharClassifier.cs
- BufferModesCollection.cs
- MonitoringDescriptionAttribute.cs
- MobilePage.cs
- FreezableOperations.cs
- WebPartCloseVerb.cs
- XmlSchemaComplexContentExtension.cs
- XmlSecureResolver.cs
- Italic.cs
- XmlRootAttribute.cs
- TextControl.cs
- DocumentViewerAutomationPeer.cs
- DynamicMethod.cs
- ChannelParameterCollection.cs
- RelationshipWrapper.cs
- Module.cs
- PasswordRecovery.cs
- DynamicQueryableWrapper.cs
- DependencyPropertyKey.cs
- ProgressBarRenderer.cs
- KeyGesture.cs
- Tuple.cs
- ClientTarget.cs
- Operator.cs
- keycontainerpermission.cs
- ConnectivityStatus.cs
- PtsPage.cs
- XmlDictionaryString.cs
- SqlClientWrapperSmiStreamChars.cs
- ConfigurationException.cs
- EntityCommandExecutionException.cs
- NullableDecimalSumAggregationOperator.cs
- Delegate.cs
- httpapplicationstate.cs
- TableLayoutRowStyleCollection.cs
- OneToOneMappingSerializer.cs
- coordinatorscratchpad.cs
- Sql8ExpressionRewriter.cs
- COMException.cs
- ObjectStateFormatter.cs
- Cursor.cs
- DropDownButton.cs
- PtsCache.cs
- PermissionSetTriple.cs
- AutomationPeer.cs
- MultipleCopiesCollection.cs
- DiscreteKeyFrames.cs
- DataMemberFieldEditor.cs
- SqlPersonalizationProvider.cs
- Input.cs