DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ネットワークのトレースを行う

注意:ここで紹介している方法は.NET Framework 2.0以降で有効です。それ以外では、ネットワークモニタを使用するなどの方法が考えられます。ネットワークモニタに関しては、@ITのこちらの記事で詳しく説明されています。また、Wireshark(旧Ethereal)というツールも有名です。それ以外でも、Vectorで検索すれば見つかるでしょう。

WebClientクラスや、HttpWebRequest、HttpWebResponse、FtpWebRequest、FtpWebResponse、Socket、TcpClientクラスなどを使ってインターネット通信を行うアプリケーションを作成する際に、ネットワークのトレースを行う方法を紹介します。

.NET Framework 2.0以降は、非常に簡単な方法が用意されています。「TraceSourceを使用してトレースする、ログに書き込む」で紹介したTraceSourceがすでに用意されています。後はこれを有効にするだけです。

ネットワークのトレースを有効にするには、「TraceSourceを使用してトレースする、ログに書き込む」で紹介しているように、アプリケーション構成ファイルの内容を変更します。

ネットワークトレースを有効にする最も簡単(?)なアプリケーション構成ファイルの内容は次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.Net.Sockets" switchName="NetSwitch"/>
      <source name="System.Net" switchName="NetSwitch"/>
      <source name="System.Net.HttpListener" switchName="NetSwitch"/>
      <source name="System.Net.Cache" switchName="NetSwitch"/>
    </sources>
    <switches>
      <add name="NetSwitch" value="Verbose"/>
    </switches>
  </system.diagnostics>
</configuration>

アプリケーション構成ファイルをこのようにすると、既定のリスナであるDefaultTraceListenerだけが使用されます。よって、トレースの結果はVisual Studioの出力ログに出力されます。

例えば次のようなコードを実行したとき、

VB.NET
コードを隠すコードを選択
Dim wc As New System.Net.WebClient()
wc.DownloadFile("http://localhost/index.html", "C:\test.html")
wc.Dispose()
C#
コードを隠すコードを選択
System.Net.WebClient wc = new System.Net.WebClient();
wc.DownloadFile("http://localhost/index.html", "C:\\test.html");
wc.Dispose();

出力される結果は、次のようになります。

出力された内容の意味については、「ネットワーク トレースの解釈」をご覧ください。

より詳しい説明

先に示したアプリケーション構成ファイルでは、sources要素に4つのsourceを記述しました。これらのsourceはそれぞれトレース出力元のクラスが異なります。例えば上記の例のようにWebClient.DownloadFileメソッドをトレースする場合は、"System.Net"だけで十分です。

sourceの名前とそのトレース出力元のクラスは、次のようになります(ヘルプからの抜粋)。

sourceの名前 出力元
System.Net.Sockets Socket クラス、TcpListener クラス、TcpClient クラス、および Dns クラスのパブリック メソッドの一部
System.Net HttpWebRequest クラス、HttpWebResponse クラス、FtpWebRequest クラス、および FtpWebResponse クラスのパブリック メソッドの一部、および無効な証明書、不足している発行元一覧、クライアント証明書のエラーなどの SSL デバッグ情報
System.Net.HttpListener HttpListener クラス、HttpListenerRequest クラス、および HttpListenerResponse クラスのパブリック メソッドの一部
System.Net.Cache System.Net.Cache のプライベート メソッドと内部メソッドの一部

switches要素内のスイッチのvalueには、レベルを指定します。指定できる値は、Critical、Error、Verbose、Warning、およびInformationです。Verboseを指定しておけば、すべて出力されるでしょう。

その他の設定

その他の設定としては、maxdatasizeとtracemodeがあります。maxdatasizeには、ネットワークデータの最大バイト数を設定します。既定値は1024です。tracemodeには、トレースを16進形式で出力するかを指定します。tracemodeに"includehex"を指定すれば16進形式とテキスト形式の両方で出力します。"protocolonly"を指定すると、テキスト形式のみで出力します。既定値は"includehex"です。

これらを変更する例は、後述します。

ログをファイルに出力する

ログをファイルに出力する方法は、「TraceやDebugのWriteメソッドでファイルに出力する」や「TraceSourceを使用してトレースする、ログに書き込む」で紹介している方法と同じです。つまり、TextWriterTraceListenerやDelimitedListTraceListenerなどのリスナを追加すればよいのです。

以下に、TextWriterTraceListenerを使ってログをファイル"C:\TextLog.txt"に保存するようにするアプリケーション構成ファイルの例を示します。さらに、Visual Studioの出力ウィンドウにトレースを表示しないようにするために、既定のリスナであるDefaultTraceListenerを削除しています。ついでにmaxdatasizeとtracemodeも変更しています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.Net" switchName="NetSwitch"
              maxdatasize="10240" tracemode="protocolonly">
        <listeners>
          <remove name="Default"/>
          <add name="TextLog"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="NetSwitch" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="TextLog"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="C:\TextLog.txt" />
    </sharedListeners>
  </system.diagnostics>
</configuration>

上記のように変更した結果、ログには次のように書き込まれるようになります。

  • 履歴:
  • 2008/9/11 EtherealがWiresharkに変わったことによる記述の修正。
  • 2011/2/4 リンクの間違いを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。