ネットワークのトレースを行う
注意:ここで紹介している方法は.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の出力ログに出力されます。
例えば次のようなコードを実行したとき、
Dim wc As New System.Net.WebClient()
wc.DownloadFile("http://localhost/index.html", "C:\test.html")
wc.Dispose()
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.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が有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。