11

デバッグの目的で、アプリケーション内のすべてではなく特定の HttpWebRequest トラフィックをキャプチャしたいと考えています。これは、IIS によってホストされる Web サービスです。

How to: Configure Network Tracingを読みました。これはうまく機能しますが、ファイル システムのアクセス許可の問題やデータの機密性などの可能性があるため、トレースをファイルに送信したくありません。メモリ内の何かに直接キャプチャして、後で検査できるようにしたいと考えています。または暗号化して電子メールで送信します。できれば、これには app.config ファイルへの変更は含まれません。

私は次のことを試しましたが、明らかに TextWriterTraceListener を System.Net に結び付ける手順がありません。System.Net トラフィックを StringWriter にキャプチャするにはどうすればよいですか?

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>
4

3 に答える 3

4

リフレクションを介してコードで System.Net ログを接続する方法を次に示します。コードは VB ですが、C# に変換するのは簡単です...

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() に入れて、オンにする条件を指定します。読む前に Flush() tr が必要な場合があります。

于 2013-07-12T01:25:16.720 に答える
3

独自の TraceListener 実装を作成できます。私がオンラインで見つけた、実行時に設定する例は、システム トレース ソースの操作を示していません手を汚してもかまわない場合は、リフレクションを使用して、private static bool System.Net.Logging.s_LoggingEnabled (.NET 2) を切り替えることができます。

次の記事の例を見て、電子メールの送信から、トレース メッセージの受信に関心がある場合にサブスクライブできる静的イベントの発行に切り替えます。

System.Diagnostics の拡張

ログは常に有効になっているため (web.config で構成されているようにすべてまたは何も構成されていないため)、これによりパフォーマンス ヒットが発生します。(この記事とコメントを参照して、パフォーマンスを向上させるためにデフォルトのトレースを削除することの重要性を説明してください。)

于 2010-10-25T17:59:54.930 に答える