【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

氏名

Twitter

URL

おくぬし ひろし

hirookun

https://blogs.technet.com/hirookun

いのうえ あきら

chack411

https://blogs.msdn.com/chack/

ものえ おさむ

osamum_MS

https://blogs.msdn.com/osamum

たけだ まさき

masakit_ms

https://blogs.msdn.com/web_

しんむら たけし

tashinmu

https://blogs.msdn.com/tashinmu

えーえすぴーどっとねっと

#aspnetjp

https://msdn.microsoft.com/ja-jp/asp.net/default.aspx

うぇぶまとりっくす

#webmatrixjp

https://www.microsoft.com/web/webmatrix

すらうぇぶ

 

https://www.microsoft.com/web

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 で実行しました。

きちんと動作するとこんな画面になります。ちょーシンプル。

image


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 を登録するとこれが表示される。)

image

3-3. Web アプリケーションの登録と設定

c:\Sample 以下に App1 と App2 をコピーしたとします。

app1, app2 それぞれを Web アプリケーションとして登録します。

image

さてと。動くかなぁ? App1 で動きを見ることにします。COM を介しても同じなのでシンプルな方で説明します。

App1 を選択している状態で右の操作ウィンドウで 参照 を実行します。 https://localhost/app1/

じゃん! 動かない。。。

image

うん?ブラウザーの設定かな、まず。
オプション - 詳細設定から HTTP エラーメッセージの簡易表示をオフにしないと。。。
こういうのが表示されるかな?

image

Windows 7 だとエラーページの表示設定がサーバーと違うんですね。
ここ直しましょうか。エラーページのアイコンをダブルクリックします。構成設定の編集で3つ目のオプションにします。

image

さて、ふん!なんかそれらしくなってきた。(^_^)

image

ここで IIS マネージャーの ASP アイコンを開いて設定をみてみる。特に見るべきはデバッグプロパティです。

おお スクリプト エラーメッセージのところに書いてある英語が実際に表示されていますね。ここを日本語にしてもいいんですが、そこはお任せするとして、ポイントは ブラウザーへのエラー送信 を True にすることです。右で適用をクリックするのを忘れないように。

image

ADODB.Connection エラー '800a0e7a'

プロバイダーが見つかりません。正しくインストールされていない可能性があります。

/app1/Default.asp, 行 12

あぁ ようやく 見慣れた文字が (^_^)

さてとダメなのかなぁとあきらめてしまいそうなメッセージが出てきました。ふむふむふむ。
どこか捻れば動くのかなぁ?

やっぱ 64 ビットがいかんのかなぁ プロバイダー対応していないのかなぁと思った人は鋭い。。。

次にやってみるべきことは動作空間であるアプリケーションプールの設定を見てみることです。

そのまま Default Web Site に配置している場合には DefaultAppPool を使用しているはずです。
DefaultAppPool の詳細設定を見てみましょうね。

image

32 ビット アプリケーションの有効化 を True にしてみるか?
一応プロセスの設定なのでリサイクルを右のウィンドウでかけておきましょう。

動け!!

image

動くんですねぇ !(^^)!


とまぁかなり長い投稿になっていますが、大体気にすべき要素は結構ここに盛り込まれている気がします。もうひとつ、ブログではもっとデバッグの要素を掘っておきましょうか。次の投稿でそこは書きましょう。

注意書き

この投稿だけ検索エンジンから来てご覧になった方はセミナーの全内容をご覧になっていないと思うので注意書きを。

セミナーではあくまでも延命措置として ASP の稼動は説明しました。できる限り Windows Azure へのステップになるので、ASP+COM は ASP.NET へ、MDB は SQL Server エンジン(Web エディション以上、あるいは無償の Express)を推奨、ファイルベースがいい場合には SQL Server Compact (これも無償)を推奨しています。

ということで Enjoy!