IIS 7 版 mod_info 的なものをサービスとして使用するツール


先日のブログで、IIS 7 用の Apache における mod_info、mod_status 的なモジュール (ハンドラー) について書きました。

先日のブログにも書いたとおり、このモジュールは HTTP リクエストを受けると、その時点のサーバーのリソース使用状況の情報を返し、クライアントが Web ブラウザであれば、その情報を目視することができます。

しかし、実際に送られてくるデータは HTML ではなく XML であり、かつ、SOAP や JSON でもデータを返せるので、アプリケーションはこれをサービスとして使用することができます。

言ってみれば、羊の皮を被った娘、ちがった、狼的な仕様となっているわけですが、そんな 便利な機能もそれを使うクライアントが無くてはただの Web ページと変わりません。

そこで今回は、このモジュールが出力する XML を受け取って表示を行うアプリケーションの作成方法について書きたいと思います。

ステップとしてはこんなとこでしょう。

1. Web サーバーにリクエストを出し、レスポンスを取得する
2. XML を処理する

ここからは上記 2 点についての具体的な簡単なコードをご紹介しましょう。あ、.NET で言語は C# ですよ。

 

Web サーバーにリクエストを出してレスポンスを受け取るには?

じつは、いちいち項目を上げるほどでもなく簡単な記述で可能です。

具体的には以下のように記述します。

//リクエストのインスタンスを生成
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://mySweetWebServer/iisreswatch/iis.info);

//クレデンシャルを指定
request.Credentials = CredentialCache.DefaultCredentials;

//レスポンスを取得
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// レスポンスに関連づいたストリームを取得
Stream receiveStream = response.GetResponseStream();

//ストリームからコンテンツを UTF-8 で取り出し
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

//ストリームからコンテンツをテキストで取得
string responseXml = readStream.ReadToEnd();

response.Close();
readStream.Close();

(サンプル : web サーバーにリクエストを出しコンテンツを取得する)

上のサンプルコードでは、変数 responseXml にコンテンツ、たとえば前述のハンドラーであれば XML 返ってくるので、あとは好きに処理を行えばいいのです。

 

XML の処理

XML の処理と言えば、一般的に良く使用されるものに DOM ( ト゜ム )  と SAX ( サックス ) というものがあります。

ご存じのとおり、前者はツィマッド社が開発したジオン公国が誇る陸戦用重モビルスーツで、後者は Jazz でおなじみの管楽器です、というのは真っ赤な嘘でして、本当は Document Object ModelSimple API for XML の略です。

2 つともよく使用される優れた方法でありますが、ここではそれ以外の第三の方法をご紹介しましょう。

前出のハンドラーが返す XML は、サーバーのリソース情報を持ったオブジェクトインスタンスを XML にシリアル化したものです。

この XML は適切に処理を行うことで、元のオブジェクトインスタンスに戻すことができます。(デシリアライズといいます。)

ちなみにハンドラー内では、おおよそ以下のとような感じで XML のシリアライズ処理を行っています。

using System.Xml.Serialization;

//SourceClass クラスのインスタンスを socObj に生成
SourceClass socObj = new SourceClass();

//XML シリアライザーのインスタンスを生成
XmlSerializer serializer = new XmlSerializer(typeof(SourceClass));
Stream memStream = new MemoryStream();

//シリアル化
serializer.Serialize(memStream, socObj);

//オブジェクトシリアル化した XML を取り出し
memStream.Seek(0, SeekOrigin.Begin);
StreamReader streamReader = new StreamReader(memStream);
string objXml = streamReader.ReadToEnd();

(サンプル : オブジェクトインスタンスの XML シリアル化処理)

 

さらにちなみに SOAP のシリアル化は以下のようにして行っています。

using System.Runtime.Serialization.Formatters.Soap;

//SourceClass クラスのインスタンスを socObj に生成
SourceClass socObj = new SourceClass()

//SOAP フォーマッタのインスタンスを生成
IFormatter formatter = new  SoapFormatter();

//シリアル化処理に使用するメモリストリームを生成
Stream memStream = new MemoryStream();

//シリアル化
formatter.Serialize(memStream, socObj);

//オブジェクトをシリアル化した XML を取り出し
memStream.Seek(0, SeekOrigin.Begin);
StreamReader streamReader = new StreamReader(memStream);
string objXml = streamReader.ReadToEnd();

(サンプル : オブジェクトインスタンスの SOAP シリアル化処理)

デシリアライズも似たような感じで行えます。

string objXml = //サーバーから XML を取得する処理

//オブジェクトがシリアル化された XML をストリームに読み込み
MemoryStream memStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(ObjXml));

//元の型を使用してデシリアライズ
XmlSerializer serializer = new XmlSerializer(typeof(SourceClass));

//元の型にキャスト
SourceClass socObj = (SourceClass) serializer.Deserialize(memStream);

(サンプル : オブジェクトインスタンスの XML デシリアル化処理)

ソース内に青字で記述しているとおり、XML のシリアライズ、デシリアライズには、オブジェクト インスタンスのもとになっているクラス、型が必要になります。

サーバーと、クライアントでシリアライズと、デシリアライズ処理を行うプログラムが異なる場合は、デシリアライズ側は処理を行う XML がどのような型でシリアライズされたのかを知っておく必要があります。

シリアライズに使用された型が独自の構造のクラスであったとしても、どのような構造かわかっていればデシリアライズ側で同様の構造のクラスを宣言してデシリアライズに使用することができます。

これが SOAP の場合は簡単ではなく、シリアライズに使用されたクラスのネームスペース、宣言、その他をまったく同じにしないと解析エラーが発生し、デシリアライズを行うことができません。

ちなみに SOAP のデシリアライズは以下のように行います。デシリアライズ処理の引数に、元の型を指定する必要がないので、一見アバウトそうに見えますが、アプリケーションドメイン内に合致するクラスがないか、しっかりと調べています。

string objXml = //サーバーから XML を取得する処理

//オブジェクトがシリアル化された XML をストリームに読み込み
MemoryStream memStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(ObjXml));

//SOAP フォーマッタのインスタンスを生成
IFormatter formatter = new SoapFormatter();

//元の型を使用してデシリアライズし、元の型にキャスト
SourceClass socObj = (SourceClass) formatter.Deserialize(memStream);

(サンプル : オブジェクトインスタンスの SOAP デシリアル化処理)

 

サンプルアプリケーション

前出のハンドラー、(と、いちいち書くのもなんなので、以降 “IisResourceWach” と記述します。”) の返す xml を、前出のサンプルコードと同じくデシリアライズして情報を表示するコマンドラインツールです。(  IisResourceWach ハンドラをサービスとして使用する  XML クライアントです。)

インストールは、以下のリンクから zip を入手して、中の iisreswatch.exe を適当な場所にコピーするだけです。(※ IisresourceWatch ハンドラがどこかの IIS で動作している必要があります。)

使い方はコマンドプロンプトを起動し、cd コマンドで作業フォルダを iisreswatch.exe があるフォルダに切り替えたら以下のようにコマンドを入力するだけです。

ヘルプを表示する

IisReswatch /?

 

image

 

サーバーのリソース使用状況を表示する

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info

※引数 –url: に指定するのは IisResouceWatch ハンドラの URL です。

image

サイト “Default Web Site” の情報を表示する

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info –type:site –name:”Default Web Site”

※名前にスペースを含むものは、””(ダブルクォーテーション) でくくってください。 –name: を省略すると既定の Web サイトである “Default Web Site” の情報が返されます。

 

アプリケーションプール “DefaultAppPool” の情報を表示する

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info –type:ap –name:”DefaultAppPool”

※名前にスペースを含むものは、””(ダブルクォーテーション) でくくってください。 –name: を省略すると既定の Web サイトである “DefaultAppPool” の情報が返されます。

 

プロセス ID が 5660 のワーカープロセスの情報を表示する

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info –type:wp –id:5660

※ワーカープロセスの ID は一定ではありませんので、直前に他のコマンドを実行し確認してください。

 

基本認証が設定された URL にアクセスするには

-uid: と –pwd: にユーザー ID をパスワードを指定します。

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info –uid:ユーザーアカウント –pwd:パスワード

取得される XML をファイルに保存するには

-save : オプションで保存先を指定します。

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info –type:wp –id:5660 -save:c:\temp\wpResult.xml

保存した XML ファイルを読み込んで表示するには

IisReswatch –load:c:\temp\wpResult.xml –type:wp

-load: に読み込む XML ファイルのパスを指定します。 –type: は保存してある XML の内容に合わせてください。

type : に指定できるスイッチは以下の通りです。

srv サーバー全体の情報を表示
site サイトの情報を表示
ap アプリケーションプールの情報を表示
wp ワーカープロセスの情報を表示

表示された情報をファイルに保存するには

通常の標準出力ですので > が使用できます。

IisReswatch –ur:http://サーバー名/ディレクトリ名/iis.info > result.txt

 

今回のサンプルアプリケーションをアップロードの際に、こまかな不具合を修正を修正した IisResourceWatch ハンドラーもアップデートしましたのでお使いください。

それからツイッターはじめました。osamum_MS です。

それではまた。

Real Time Analytics

Clicky

Comments (0)

Skip to main content