【IIS7】 Active Server Pages を Windows Server 2008 R2 で動かす
昨日実施したセミナーの一部はこのテーマを取り上げていました。残りはマイクロソフトの Web 技術を包括的に見てみるというものでした。
さて、じゃあ動かすところの詳細を書いておきましょう。
ちょっと注意事項。
ここで記述しているサンプルをそのまま運用で実装することを推奨しているわけではありません。よく現場で見られるからこそ例えば mdb を採用しています。Web サーバーに必要な同時実行性を考えた場合にはやるべきではありません。 手軽だからやってしまってきたというのは OK じゃないんです。そういう観点をちゃんと考慮することを前提に、それでもそのままどうしても動かす必要があると思い、敢えてデモしていますのでご注意ください。
それからデモ用のサンプルなのでエラーハンドリングが云々とかは抜きです。
1. [準備] Windows DNA アプリケーションを用意する
なんか素敵なサンプルがあれば良かったのですが、むしろ泥臭いアプリの方が伝わるかなと思ったのでちょー簡単なアプリを用意してみました。
以下においておきますが、本当にコンセプトを理解することだけにお使いください。
あまりプログラミングとしては役に立ちませんので。(^_^)
https://cid-622560ce2c85aea1.office.live.com/browse.aspx/TFSeminar20101112?Bsrc=EMSHOO&Bpub=SN.Notifications
ASP → MDB のパターンと ASP → VB6コンポーネント → MDB の二つを作りました。
Pattern 1
default.asp
<%@ Language=VBScript %>
<html>
<head></head>
<body bgColor=Yellow>
<%
Dim objCon
Dim objRs
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Provider = "Microsoft.Jet.OLEDB.4.0"
objCon.ConnectionString = "C:\sample\app1\test.mdb"
objCon.Open
set objRs = Server.CreateObject("ADODB.Recordset")
strSQL = "select [氏名],[Twitter],[URL] from profile"
objRS.Open strSQL, objCon, 3
%>
件数は <%=objRS.RecordCount%> 件
<br>
<br>
<table border="1">
<tr>
<td>氏名</td>
<td>Twitter</td>
<td>ブログ</td>
</tr>
<%
Do Until objRS.EOF
%>
<tr>
<td><%=objRS("氏名").value%></td>
<td><%=objRS("Twitter").value%></td>
<td><%=objRS("URL").value%></td>
</tr>
<%
objRS.MoveNext
Loop
objCon.Close
Set objCon = Nothing
%>
</body>
</html>
test.mdb
Access を使用して作ったものは Visual Studio の再頒布可能な mdb とは本来使用権なども含め、異なるものです。でもここでは現場でよく見てきた方法論で Access でデータを作っています。本当は NG よん。なんでもいいのですが、どういうデータを作ったかも書いておきます。余談ですが、このデータにあるブログとか Twitter アカウントをぜひ活用ください。
profile テーブル: 氏名、Twitter、URL
氏名 |
URL |
|
おくぬし ひろし |
hirookun |
|
いのうえ あきら |
chack411 |
|
ものえ おさむ |
osamum_MS |
|
たけだ まさき |
masakit_ms |
|
しんむら たけし |
tashinmu |
|
えーえすぴーどっとねっと |
#aspnetjp |
|
うぇぶまとりっくす |
#webmatrixjp |
|
すらうぇぶ |
Pattern 2
default.asp
<%@ Language=VBScript %>
<html>
<head></head>
<body bgColor=Yellow>
<%
Dim objRs
Dim objTF
Dim cnt
set objTF = Server.CreateObject("TFSem02.DataTier")
cnt = objTF.GetCount
%>
件数は <%=cnt%> 件
<br>
<br>
<table border="1">
<tr>
<td>氏名</td>
<td>Twitter</td>
<td>ブログ</td>
</tr>
<%
dim dName
dim dTwitter
dim dURL
dim rt
for i = 0 to cnt -1
rt = objTF.GetData(i+1, dName, dTwitter, dURL)
%>
<tr>
<td><%=dName%></td>
<td><%=dTwitter%></td>
<td><%=dURL%></td>
</tr>
<%
Next
%>
</body>
</html>
DataTier.cls
Public Function GetCount() As Variant
Dim objCon As ADODB.Connection
Dim objRs As ADODB.Recordset
Set objCon = CreateObject("ADODB.Connection")
objCon.Provider = "Microsoft.Jet.OLEDB.4.0"
objCon.ConnectionString = "C:\sample\app1\test.mdb"
objCon.Open
Set objRs = CreateObject("ADODB.Recordset")
strSQL = "select [氏名],[Twitter],[URL] from profile"
objRs.Open strSQL, objCon, 3
GetCount = objRs.RecordCount
objCon.Close
Set objCon = Nothing
End Function
Public Function GetData(ByVal cnt As Variant, _
dName As Variant, dTwitter As Variant, dURL As Variant) As Variant
Dim objCon As ADODB.Connection
Dim objRs As ADODB.Recordset
Set objCon = CreateObject("ADODB.Connection")
objCon.Provider = "Microsoft.Jet.OLEDB.4.0"
objCon.ConnectionString = "C:\sample\app1\test.mdb"
objCon.Open
Set objRs = CreateObject("ADODB.Recordset")
strSQL = "select [氏名],[Twitter],[URL] from profile"
objRs.Open strSQL, objCon, 3
Do Until objRs.AbsolutePosition = cnt
objRs.MoveNext
Loop
dName = objRs.Fields(0).Value
dTwitter = objRs.Fields(1).Value
dURL = objRs.Fields(2).Value
objCon.Close
Set objCon = Nothing
End Function
2. [準備] 従来の環境で動作確認
XP でもなんでもいいのですが、IIS5 なり、IIS6 の環境でこれを実行します。
DLL は TFSem02.dll としてビルドしたものをコンポーネントサービスに登録して実行しました。
セミナー時にはリアル感重視で、敢えて(サポートが終了している)Windows 2000 Professional で実行しました。
きちんと動作するとこんな画面になります。ちょーシンプル。
3. さあ Windows Server 2008 R2 へ いざ参る (^_^)v
App1
- default.asp
- test.mdb
App2
- default.asp
- TFSem02.dll
- test.mdb
これをフォルダごと Windows Server 2008 R2 のマシンへコピーします。
このブログを書いている便宜上、Windows 7 上で今はやります。まあ 同じです。IIS7.5 ですし。
3-1. 事前に確認しておくべきこと
asp がインストールされていることを確認しないといけません。Windows 7 であれば Windows の機能の有効化または無効化から以下の階層をチェックしましょう。
インターネット インフォメーション サービス
- World Wide Web サービス
- アプリケーション開発機能
- ASP
この ASP がインストールされていないといけません。
3-2. アプリケーションの登録
あまり今の世代で画面を見ないのですが、コンポーネントサービスはちゃんとあります。ただ、UAC もある関係で当時の開発では普通に DLL をドラッグ&ドロップで登録していたのですが、今はできないのでウィザードをちゃんと動かす必要があります。ページが増えていて、ロールなどの追加設定ができるようになっています。
アプリケーション:TFSem1112
コンポーネント:TFSem02.DataTier (TFSem02.dll を登録するとこれが表示される。)
3-3. Web アプリケーションの登録と設定
c:\Sample 以下に App1 と App2 をコピーしたとします。
app1, app2 それぞれを Web アプリケーションとして登録します。
さてと。動くかなぁ? App1 で動きを見ることにします。COM を介しても同じなのでシンプルな方で説明します。
App1 を選択している状態で右の操作ウィンドウで 参照 を実行します。 https://localhost/app1/
じゃん! 動かない。。。
うん?ブラウザーの設定かな、まず。
オプション - 詳細設定から HTTP エラーメッセージの簡易表示をオフにしないと。。。
こういうのが表示されるかな?
Windows 7 だとエラーページの表示設定がサーバーと違うんですね。
ここ直しましょうか。エラーページのアイコンをダブルクリックします。構成設定の編集で3つ目のオプションにします。
さて、ふん!なんかそれらしくなってきた。(^_^)
ここで IIS マネージャーの ASP アイコンを開いて設定をみてみる。特に見るべきはデバッグプロパティです。
おお スクリプト エラーメッセージのところに書いてある英語が実際に表示されていますね。ここを日本語にしてもいいんですが、そこはお任せするとして、ポイントは ブラウザーへのエラー送信 を True にすることです。右で適用をクリックするのを忘れないように。
ADODB.Connection エラー '800a0e7a'
プロバイダーが見つかりません。正しくインストールされていない可能性があります。
/app1/Default.asp, 行 12
あぁ ようやく 見慣れた文字が (^_^)
さてとダメなのかなぁとあきらめてしまいそうなメッセージが出てきました。ふむふむふむ。
どこか捻れば動くのかなぁ?
やっぱ 64 ビットがいかんのかなぁ プロバイダー対応していないのかなぁと思った人は鋭い。。。
次にやってみるべきことは動作空間であるアプリケーションプールの設定を見てみることです。
そのまま Default Web Site に配置している場合には DefaultAppPool を使用しているはずです。
DefaultAppPool の詳細設定を見てみましょうね。
32 ビット アプリケーションの有効化 を True にしてみるか?
一応プロセスの設定なのでリサイクルを右のウィンドウでかけておきましょう。
動け!!
動くんですねぇ !(^^)!
とまぁかなり長い投稿になっていますが、大体気にすべき要素は結構ここに盛り込まれている気がします。もうひとつ、ブログではもっとデバッグの要素を掘っておきましょうか。次の投稿でそこは書きましょう。
注意書き
この投稿だけ検索エンジンから来てご覧になった方はセミナーの全内容をご覧になっていないと思うので注意書きを。
セミナーではあくまでも延命措置として ASP の稼動は説明しました。できる限り Windows Azure へのステップになるので、ASP+COM は ASP.NET へ、MDB は SQL Server エンジン(Web エディション以上、あるいは無償の Express)を推奨、ファイルベースがいい場合には SQL Server Compact (これも無償)を推奨しています。
ということで Enjoy!