y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

MovableTypeで生成したメニュー部品をASP.NETの中で使う

WebサイトをMovableType(以下MT)で構築した場合、カテゴリ/サブカテゴリを使って、動的生成された階層メニューを使うケースがある。
MT以外のWebアプリケーションをこのサイトに組み込みたい場合など、メニューを共通化して使いたいと考える。
MTでメニュー用のHTML部品を生成するのは簡単だ。
問題は、これをASP.NETなどの他プログラム内にインクルードして使う方法だ。
MTからXMLで書き出して、XMLをパースするのも良いが、XMLからどちらみちHTMLに復元しなければならない。
また、リモートのXMLをJavacriptなどで使う際には、クロスドメインの制限が掛かる。考え方としてはMTIncludeみたいなことを、リモートファイルに対して行うというイメージだ。

■Includeはダメか?
ASPには#Include File="ファイル名でSSIが使えた。
ASP.NETでも、互換性を保つため、Include virtual="ローカルファイル名"でインクルードが可能だ。
しかし、リモートファイルを読み込みことは出来ないため、別の方法を考える必要がある。
■HTTPリクエストでファイルを読み込み、テキストフィールド内に書き出す
HTTPリクエストでリモートファイルをストリームで読み取り、リテラル文字列としてそのままテキストを書き出す方法ではどうか。
これならばっちり。
ページロードでHTTP読み取りをして、動的にテキストを書くため、MT側との時差も無い。
※本当なら、アプリケーション変数で読み込むとか、キャッシュするなどの処理が必要だろう。

<具体例>
■Application変数”MenuPartsURI”
Global.asax内Application_Startで実行
//メニュー部品のURL
string MenuURI = common.GetConfig("menu");
Application.Set("MenuPartsURI", MenuURI);

■フォーム読み込み時(Page_Load)に実行
//メニュー取得
string strRssFeedText = common.GetWebPageAsString(Application.Get("MenuPartsURI").ToString());
txtMenuText.Text = strRssFeedText;


■App_Code\common.cs (commonクラス)
public static string GetWebPageAsString(string strURI)
{
//Declare our variables.
WebRequest objWebRequest;
WebResponse objWebResponse;
Stream objStream;
StreamReader objStreamReader;
string strResponseText;

//Create a new request.
objWebRequest = WebRequest.Create(strURI);

//Get the response to our request as a stream object.
objWebResponse = objWebRequest.GetResponse();
objStream = objWebResponse.GetResponseStream();

//Create a stream reader to read the data from the stream.
objStreamReader = new StreamReader(objStream);

//Copy the text retrieved from the stream to a variable.
strResponseText = objStreamReader.ReadToEnd();

//Close our objects.
objStreamReader.Close();
objStream.Close();
objWebResponse.Close();

//Set return value.
return strResponseText;
}
public static string GetConfig(string param) {
if (param == null)
{
return "";
}
else {
//App.config(Web.config)から情報取得
return ConfigurationManager.AppSettings[param].ToString();
}

}