« 入力xmlファイルの内容をDataSetに変換できません | メイン | 利用権限のあるプログラムだけメニューに表示 »
2007年06月13日
仕事の周辺 » .NET » ASP.NETWebアプリをメンテナンス中に切り替える
ASP.NET2.0になって追加された便利な機能を調べながらより管理が楽なWebアプリの作成ガイドラインのようなものを作成中。年明けにコピーライトのところの年表示をあちこち書き換えて回るようなことは止めようよ、レベルのプリミティブな話なのですが(^^;)、それらに加えサーバーのアップデート等の際に簡単にメンテナンスモードに切り替えられれば楽だなと。
2.0のWebサイト管理ツールにあってもよさげだと思ったのですがそれらしいものが見当たらず。自前で作るなら「メンテナンス中です」ページを作成し、DBかコンフィグからフラグ読んでGlobal.asaxでリダイレクトかな、メンテナンス中ページのファイル名はやはりMaintenance.aspxかな、で「Global.asax」と「Maintenance.aspx」で検索したらありました。見つけた時はコピれば終わりじゃん、と思ったのですが、色々はまってしまいました。
まず、2.0ではGlobal.asaxにApplication_BeginRequestセクションがない。調べるとVS2005のテンプレートにはないけどイベント自体は存在するらしい。2003だとプロパティ画面でイベントの一覧が確認できたのに、2005で表示の出し方が分からず、手で入力。
で、入力後実行したら今度はデザインがとんでしまってます。CSSファイルにまでこのイベントが適用されているっぽい。しょうがないからパターンマッチで拡張子をチェックし、aspxファイルにのみ適用するに変更。
無事トップページがメンテナンス中表示に切り替わることを確認。サブフォルダ内のページに直接アクセスしたら、ページが見つかりません。サンプルの"Maintenance.aspx"を"~/Maintenance.aspx"に書き換えやっとメンテナンス表示に切り替わったと思ったらまたデザインがとんでしまってます。このあたりでだんだん根気が切れそうになってきます。
メンテナンスモードをoffにした時と、onにした時のソースを確認すると、CSSへのリンクがoffの時「../App_Themes/…」、onの時「App_Themes/…」とずれてます。サブフォルダ内から外にあるMaintenance.aspxへリンクしているのですが、表示されているソースはMaintenance.aspxのままだけれど、URLはサブフォルダのままなので、スタイルシートとの位置関係がずれてしまっているようです。URL変わらない方がかっこいいけれど、メンテナンスのことを考えると別に変わってもいいではないか、と思って「HttpContext.Current.RewritePath」を「Response.Redirect」に変えてみたらリダイレクト先からさらにリダイレクトされてえらいことになってしまいました(^^;)。ここでぶちきれ帰ってきましたが、こうして書いていたら、もう一つパターンマッチ追加しMaintenance.aspxだったら無視するようにすればいいかな(^^;)。
とりあえず上記のサンプルを2.0用に書き直したサブフォルダがなければ使えそうなバージョン
void Application_BeginRequest(object sender, EventArgs e)
{
//
// Check the web.config to see if the site is in maintenance mode
Regex r1 = new Regex("\\.aspx");
if (r1.IsMatch(Request.RawUrl))
{
if (ConfigurationManager.AppSettings["Maintenance Mode"] == "on")
{
HttpContext.Current.RewritePath("~/Maintenance.aspx");
//Response.Redirect("Maintenance.aspx");
}
}
}
投稿者 idic : 2007年06月13日 21:30
コメント
コメントしてください
サイン・インを確認しました、 さん。コメントしてください。 (サイン・アウト)
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)