2009-06-26 14 views
10

मैं निश्चित रूप से कैप्चर करना चाहता हूं, लेकिन सभी नहीं, डीबगिंग उद्देश्यों के लिए मेरे आवेदन में HttpWebRequest ट्रैफिक। यह आईआईएस द्वारा होस्ट की गई एक वेब सेवा है।System.Net (HttpWebRequest) फ़ाइलों या app.config का उपयोग किए बिना ट्रेसिंग?

मैंने How to: Configure Network Tracing पढ़ा है। यह बहुत अच्छा काम करता है, लेकिन मैं फ़ाइल सिस्टम, डेटा संवेदनशीलता इत्यादि पर संभावित अनुमति समस्याओं के कारण ट्रेस को फ़ाइल में निर्देशित नहीं करना चाहता हूं। मैं सीधे कुछ ऐसी मेमोरी पर कब्जा करना चाहता हूं जिसे मैं बाद में निरीक्षण कर सकता हूं या एन्क्रिप्ट और ईमेल। अधिमानतः, इसमें app.config फ़ाइल में कोई भी परिवर्तन शामिल नहीं होगा।

मैंने निम्नलिखित की कोशिश की, लेकिन जाहिर है कि मैं TextWriterTraceListener को System.Net में बांधने के लिए एक कदम खो रहा हूं। मैं अपने स्ट्रिंगवाइटर में System.Net ट्रैफ़िक कैप्चर कैसे कर सकता हूं?

StringWriter sw = new StringWriter(); 
TextWriterTraceListener myListener = new TextWriterTraceListener(sw); 
Trace.Listeners.Add(myListener); 
HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.microsoft.com"); 
HttpWebResponse resp = (HttpWebResponse) req.GetResponse(); 
Stream s = resp.GetResponseStream(); 

byte[] buf = new byte[4096]; 
while (s.Read(buf, 0, buf.Length) > 0) ; 
s.Close(); 

myListener.Flush(); 
sw.Flush(); 

संपादित करें: विशेष रूप से, मुझे लगता है कि सिवाय मैं उत्पादन network.log पर जाने के लिए नहीं करना चाहते, कार्यावधि में इस के बराबर करना चाहते हैं, मैं इसे एक स्ट्रिंग बफर मैं निर्धारित किया है के लिए जाना चाहते इस उद्देश्य के लिए।

<configuration> 

<system.diagnostics> 

<sources> 
    <source name="System.Net.Sockets" tracemode="includehex"> 
    <listeners> 
     <add name="System.Net.Sockets" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log" /> 
    </listeners> 
    </source> 
</sources> 

<switches> 
    <add name="System.Net.Sockets" value="Verbose"/> 
</switches> 

<trace autoflush="true" /> 
</system.diagnostics> 
</configuration> 
+0

: http:

अपने वीबी-कोड के साथ

, सी # करने के लिए अनुकूलित मैं इस विधि लिखा है:

/// <summary> /// Executes a action with enabled System.Net.Logging with listener(s) at the code-site /// /// Message from Microsoft: /// To configure you the listeners and level of logging for a listener you need a reference to the listener that is going to be doing the tracing. /// A call to create a new TraceSource object creates a trace source with the same name as the one used by the System.Net.Sockets classes, /// but it's not the same trace source object, so any changes do not have an effect on the actual TraceSource object that System.Net.Sockets is using. /// </summary> /// <param name="webTraceSourceLevel">The sourceLevel for the System.Net traceSource</param> /// <param name="httpListenerTraceSourceLevel">The sourceLevel for the System.Net.HttpListener traceSource</param> /// <param name="socketsTraceSourceLevel">The sourceLevel for the System.Net.Sockets traceSource</param> /// <param name="cacheTraceSourceLevel">The sourceLevel for the System.Net.Cache traceSource</param> /// <param name="actionToExecute">The action to execute</param> /// <param name="listener">The listener(s) to use</param> public static void ExecuteWithEnabledSystemNetLogging(SourceLevels webTraceSourceLevel, SourceLevels httpListenerTraceSourceLevel, SourceLevels socketsTraceSourceLevel, SourceLevels cacheTraceSourceLevel, Action actionToExecute, params TraceListener[] listener) { if (listener == null) { throw new ArgumentNullException("listener"); } if (actionToExecute == null) { throw new ArgumentNullException("actionToExecute"); } var logging = typeof(WebRequest).Assembly.GetType("System.Net.Logging"); var isInitializedField = logging.GetField("s_LoggingInitialized", BindingFlags.NonPublic | BindingFlags.Static); if (!(bool)isInitializedField.GetValue(null)) { //// force initialization HttpWebRequest.Create("http://localhost"); Thread waitForInitializationThread = new Thread(() => { while (!(bool)isInitializedField.GetValue(null)) { Thread.Sleep(100); } }); waitForInitializationThread.Start(); waitForInitializationThread.Join(); } var isEnabledField = logging.GetField("s_LoggingEnabled", BindingFlags.NonPublic | BindingFlags.Static); var webTraceSource = (TraceSource)logging.GetField("s_WebTraceSource", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); var httpListenerTraceSource = (TraceSource)logging.GetField("s_HttpListenerTraceSource", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); var socketsTraceSource = (TraceSource)logging.GetField("s_SocketsTraceSource", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); var cacheTraceSource = (TraceSource)logging.GetField("s_CacheTraceSource", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); bool wasEnabled = (bool)isEnabledField.GetValue(null); Dictionary<TraceListener, TraceFilter> originalTraceSourceFilters = new Dictionary<TraceListener, TraceFilter>(); //// save original Levels var originalWebTraceSourceLevel = webTraceSource.Switch.Level; var originalHttpListenerTraceSourceLevel = httpListenerTraceSource.Switch.Level; var originalSocketsTraceSourceLevel = socketsTraceSource.Switch.Level; var originalCacheTraceSourceLevel = cacheTraceSource.Switch.Level; //System.Net webTraceSource.Listeners.AddRange(listener); webTraceSource.Switch.Level = SourceLevels.All; foreach (TraceListener tl in webTraceSource.Listeners) { if (!originalTraceSourceFilters.ContainsKey(tl)) { originalTraceSourceFilters.Add(tl, tl.Filter); tl.Filter = new ModifiedTraceFilter(tl, originalWebTraceSourceLevel, webTraceSourceLevel, originalHttpListenerTraceSourceLevel, httpListenerTraceSourceLevel, originalSocketsTraceSourceLevel, socketsTraceSourceLevel, originalCacheTraceSourceLevel, cacheTraceSourceLevel, listener.Contains(tl)); } } //System.Net.HttpListener httpListenerTraceSource.Listeners.AddRange(listener); httpListenerTraceSource.Switch.Level = SourceLevels.All; foreach (TraceListener tl in httpListenerTraceSource.Listeners) { if (!originalTraceSourceFilters.ContainsKey(tl)) { originalTraceSourceFilters.Add(tl, tl.Filter); tl.Filter = new ModifiedTraceFilter(tl, originalWebTraceSourceLevel, webTraceSourceLevel, originalHttpListenerTraceSourceLevel, httpListenerTraceSourceLevel, originalSocketsTraceSourceLevel, socketsTraceSourceLevel, originalCacheTraceSourceLevel, cacheTraceSourceLevel, listener.Contains(tl)); } } //System.Net.Sockets socketsTraceSource.Listeners.AddRange(listener); socketsTraceSource.Switch.Level = SourceLevels.All; foreach (TraceListener tl in socketsTraceSource.Listeners) { if (!originalTraceSourceFilters.ContainsKey(tl)) { originalTraceSourceFilters.Add(tl, tl.Filter); tl.Filter = new ModifiedTraceFilter(tl, originalWebTraceSourceLevel, webTraceSourceLevel, originalHttpListenerTraceSourceLevel, httpListenerTraceSourceLevel, originalSocketsTraceSourceLevel, socketsTraceSourceLevel, originalCacheTraceSourceLevel, cacheTraceSourceLevel, listener.Contains(tl)); } } //System.Net.Cache cacheTraceSource.Listeners.AddRange(listener); cacheTraceSource.Switch.Level = SourceLevels.All; foreach (TraceListener tl in cacheTraceSource.Listeners) { if (!originalTraceSourceFilters.ContainsKey(tl)) { originalTraceSourceFilters.Add(tl, tl.Filter); tl.Filter = new ModifiedTraceFilter(tl, originalWebTraceSourceLevel, webTraceSourceLevel, originalHttpListenerTraceSourceLevel, httpListenerTraceSourceLevel, originalSocketsTraceSourceLevel, socketsTraceSourceLevel, originalCacheTraceSourceLevel, cacheTraceSourceLevel, listener.Contains(tl)); } } isEnabledField.SetValue(null, true); try { actionToExecute(); } finally { //// restore Settings webTraceSource.Switch.Level = originalWebTraceSourceLevel; httpListenerTraceSource.Switch.Level = originalHttpListenerTraceSourceLevel; socketsTraceSource.Switch.Level = originalSocketsTraceSourceLevel; cacheTraceSource.Switch.Level = originalCacheTraceSourceLevel; foreach (var li in listener) { webTraceSource.Listeners.Remove(li); httpListenerTraceSource.Listeners.Remove(li); socketsTraceSource.Listeners.Remove(li); cacheTraceSource.Listeners.Remove(li); } //// restore filters foreach (var kvP in originalTraceSourceFilters) { kvP.Key.Filter = kvP.Value; } isEnabledField.SetValue(null, wasEnabled); } } 

वर्ग ModifiedTraceFilter // vbcity। कॉम/फ़ोरम/topic.asp? tid = 140182 एक ही चीज़ के लिए पूछ रहा है। माइक्रोसॉफ्ट का जवाब निश्चित रूप से निराशाजनक है। –

उत्तर

3

आप अपना खुद का ट्रेसलिस्टर कार्यान्वयन बना सकते हैं। example (ओं) मुझे ऑनलाइन मिला है जो रन-टाइम पर चीजों को कॉन्फ़िगर करता है सिस्टम ट्रेस स्रोतों के साथ काम नहीं दिखाता है। यदि आपको अपने हाथ गंदे होने पर कोई फर्क नहीं पड़ता है तो आप निजी स्थैतिक बूल System.Net.Logging.s_LoggingEnabled (.NET 2) को टॉगल करने के लिए प्रतिबिंब का उपयोग करने का प्रयास कर सकते हैं।

निम्न आलेख में उदाहरण लें और एक स्थिर घटना है कि आप का पता लगाने संदेशों को प्राप्त करने में जब आप रुचि रखते हैं करने के लिए सदस्यता ले सकते हैं प्रकाशित करने से ई-मेल भेजना से इसे स्विच:

Extending System.Diagnostics

यह करता है एक प्रदर्शन हिट का कारण बनता है क्योंकि लॉगिंग हर समय सक्षम होती है (वेब ​​या कॉन्फ़िगर में कॉन्फ़िगर किए गए सभी या कुछ भी नहीं)। (this article देखें और प्रदर्शन को बेहतर बनाने के लिए डिफ़ॉल्ट ट्रेस को हटाने के महत्व को समझाते हुए टिप्पणियां।)

2

यहां प्रतिबिंब के माध्यम से कोड में System.Net लॉगिंग करने का तरीका बताया गया है। कोड वीबी में है, लेकिन सी # में बदलने के लिए तुच्छ है ...

Dim logging = GetType(Net.HttpWebRequest).Assembly.GetType("System.Net.Logging") 
Dim enabled = logging.GetField("s_LoggingEnabled", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static) 
enabled.SetValue(Nothing, True) 
Dim webTr = logging.GetProperty("Web", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static) 
Dim tr as TraceSource = webTr.GetValue(Nothing, Nothing) 
tr.Switch.Level = SourceLevels.Verbose 
tr.Listeners.Add(New MyTraceListener()) 

आप इसे चालू करने के लिए चाहते हैं जो कुछ शर्तों के साथ Global.asax Application_Start() में इस रखो। पढ़ने से पहले आपको फ्लश() tr की आवश्यकता हो सकती है।

4

बड़ा धन्यवाद @ एलएमके, यह अच्छा है। मुझे एक ही समस्या थी, क्योंकि मैं कोड में त्रुटि विश्लेषण के लिए नेटवर्क यातायात लॉग करना चाहता हूं। मार्को

public class ModifiedTraceFilter : TraceFilter 
{ 
    private readonly TraceListener _traceListener; 

    private readonly SourceLevels _originalWebTraceSourceLevel; 

    private readonly SourceLevels _originalHttpListenerTraceSourceLevel; 

    private readonly SourceLevels _originalSocketsTraceSourceLevel; 

    private readonly SourceLevels _originalCacheTraceSourceLevel; 

    private readonly SourceLevels _modifiedWebTraceTraceSourceLevel; 

    private readonly SourceLevels _modifiedHttpListenerTraceSourceLevel; 

    private readonly SourceLevels _modifiedSocketsTraceSourceLevel; 

    private readonly SourceLevels _modifiedCacheTraceSourceLevel; 

    private readonly bool _ignoreOriginalSourceLevel; 

    private readonly TraceFilter _filter = null; 

    public ModifiedTraceFilter(TraceListener traceListener, SourceLevels originalWebTraceSourceLevel, SourceLevels modifiedWebTraceSourceLevel, SourceLevels originalHttpListenerTraceSourceLevel, SourceLevels modifiedHttpListenerTraceSourceLevel, SourceLevels originalSocketsTraceSourceLevel, SourceLevels modifiedSocketsTraceSourceLevel, SourceLevels originalCacheTraceSourceLevel, SourceLevels modifiedCacheTraceSourceLevel, bool ignoreOriginalSourceLevel) 
    { 
     _traceListener = traceListener; 
     _filter = traceListener.Filter; 
     _originalWebTraceSourceLevel = originalWebTraceSourceLevel; 
     _modifiedWebTraceTraceSourceLevel = modifiedWebTraceSourceLevel; 
     _originalHttpListenerTraceSourceLevel = originalHttpListenerTraceSourceLevel; 
     _modifiedHttpListenerTraceSourceLevel = modifiedHttpListenerTraceSourceLevel; 
     _originalSocketsTraceSourceLevel = originalSocketsTraceSourceLevel; 
     _modifiedSocketsTraceSourceLevel = modifiedSocketsTraceSourceLevel; 
     _originalCacheTraceSourceLevel = originalCacheTraceSourceLevel; 
     _modifiedCacheTraceSourceLevel = modifiedCacheTraceSourceLevel; 
     _ignoreOriginalSourceLevel = ignoreOriginalSourceLevel; 
    } 

    public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data) 
    { 
     SourceLevels originalTraceSourceLevel = SourceLevels.Off; 
     SourceLevels modifiedTraceSourceLevel = SourceLevels.Off; 

     if (source == "System.Net") 
     { 
      originalTraceSourceLevel = _originalWebTraceSourceLevel; 
      modifiedTraceSourceLevel = _modifiedWebTraceTraceSourceLevel; 
     } 
     else if (source == "System.Net.HttpListener") 
     { 
      originalTraceSourceLevel = _originalHttpListenerTraceSourceLevel; 
      modifiedTraceSourceLevel = _modifiedHttpListenerTraceSourceLevel; 
     } 
     else if (source == "System.Net.Sockets") 
     { 
      originalTraceSourceLevel = _originalSocketsTraceSourceLevel; 
      modifiedTraceSourceLevel = _modifiedSocketsTraceSourceLevel; 
     } 
     else if (source == "System.Net.Cache") 
     { 
      originalTraceSourceLevel = _originalCacheTraceSourceLevel; 
      modifiedTraceSourceLevel = _modifiedCacheTraceSourceLevel; 
     } 

     var level = ConvertToSourceLevel(eventType); 
     if (!_ignoreOriginalSourceLevel && (originalTraceSourceLevel & level) == level) 
     { 
      if (_filter == null) 
      { 
       return true; 
      } 
      else 
      { 
       return _filter.ShouldTrace(cache, source, eventType, id, formatOrMessage, args, data1, data); 
      } 
     } 
     else if (_ignoreOriginalSourceLevel && (modifiedTraceSourceLevel & level) == level) 
     { 
      if (_filter == null) 
      { 
       return true; 
      } 
      else 
      { 
       return _filter.ShouldTrace(cache, source, eventType, id, formatOrMessage, args, data1, data); 
      } 
     } 

     return false; 
    } 

    private static SourceLevels ConvertToSourceLevel(TraceEventType eventType) 
    { 
     switch (eventType) 
     { 
      case TraceEventType.Critical: 
       return SourceLevels.Critical; 
      case TraceEventType.Error: 
       return SourceLevels.Error; 
      case TraceEventType.Information: 
       return SourceLevels.Information; 
      case TraceEventType.Verbose: 
       return SourceLevels.Verbose; 
      case TraceEventType.Warning: 
       return SourceLevels.Warning; 
      default: 
       return SourceLevels.ActivityTracing; 
     } 
    } 
} 

मज़े,

संबंधित मुद्दे