なんか需要があるとかないとか…
まず前提。Classic ASP(拡張子が.aspな昔ながらのActive Server Pages)をWindows Server 2008 x64(Windows Azure)な環境で動かすには最低限、アプリケーションプールの設定で32bitアプリの有効化(Classic ASPが32bitで動くかららしい)と、役割としてIISにASPが追加されてないといけません。
実際にWindows Azure Guest OSを見てみると、どちらもClassic ASPを動かす土台になっていないことがわかります。
さて、じゃぁどうするか?というと話は簡単?で、IISにASPの役割を追加するのとアプリケーションプールの設定を変更してあげればいいわけですね。
リモートデスクトップ接続でログインして設定変更してもいいのですが、そんなことしてたらクラウドのメリットが全くなくなるので全部バッチ(Startup Tasks)でやりたいと思います。
イカWindows Azureへ配置するための準備もろもろ。
- 空のWindows Azureプロジェクトを作成
- 新しいWebアプリケーションの追加で空のASP.NET Webアプリケーションを追加
- .asp ファイルを追加して適当にASPなコードを書く
- .cmd ファイルを追加して以下のバッチを記述
- PKGMGRつかって役割追加と、appcmdつかってアプリケーションプールの設定変更をしています
- ※CMDファイルはANSIフォーマットで保存しましょう!!(Visual Studioからテキストファイル等作成したり保存するとUTF-8なのでちゃんと動きません
起動のタイミングによってはアプリケーションプールが作成されていない(Webロールの展開が終わってない)可能性があるので手抜きでPingってループさせてますw- 2012.03.13 追記:以下のようにAppcmdでアプリケーションプールの既定値を変えちゃう方が楽で確実ですね。
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:true
- .cmd ファイルのプロパティにて「出力ディレクトリにコピー」プロパティを「常にコピーする」に変更
- 空のWindows Azureプロジェクトを右クリックして「ソリューション内のWebロールプロジェクトを追加」を選択してサービスモデルを作成
- .csdef ファイルにスタートアップタスクを設定
- スタートアップタスクではWebロールの起動を妨げないようにバックグラウンドでの実行と、役割を追加するので特権を使用するように指定しています。
- 発行してWindows Azureへデプロイ
さて実行結果ですが、以下の通りです。
- 役割
- アプリケーションプール
- 実行結果
まとめ
がんばればWindows Azure でも Classic ASPは動きます。
※アプリケーションプールの設定で32Bitアプリケーションの有効化しなくても動くんだけど、ASPによるのかな。。。
おまけ
ソースコード等です。
default.asp
<br /><html>
<br /><body>
<br /><%
<br />response.write("My first ASP script!")
<br />%>
<br /></body>
<br /></html>
<br />
enableasp.cmd
<br />@echo off
<br />start /w pkgmgr /iu:IIS-ASP;IIS-ISAPIExtensions</p>
<p>:SETAPPPOOL
<br />%windir%\system32\inetsrv\appcmd.exe list apppool > apppoollist.txt</p>
<p>FOR /f "tokens=2 delims= " %%a in (apppoollist.txt) DO (
<br />IF %%a==^"Classic (
<br />echo %%a
<br />) ELSE IF %%a==^"ASP.NET (
<br />echo %%a
<br />) ELSE (
<br />%windir%\system32\inetsrv\appcmd.exe set apppool %%a /enable32bitapponwin64:true
<br />goto END
<br />)
<br />)</p>
<p>ping localhost -n 10 > nul
<br />goto SETAPPPOOL</p>
<p>:END
<br />
ServiceDefinition.csdef
<br /><ServiceDefinition name="ClassicASPonAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<br /><WebRole name="WebApplication1">
<br /><Sites>
<br /><Site name="Web">
<br /><Bindings>
<br /><Binding name="Endpoint1" endpointName="Endpoint1" />
<br /></Bindings>
<br /></Site>
<br /></Sites>
<br /><Endpoints>
<br /><InputEndpoint name="Endpoint1" protocol="http" port="80" />
<br /></Endpoints>
<br /><Imports>
<br /><Import moduleName="Diagnostics" />
<br /><Import moduleName="RemoteAccess" />
<br /><Import moduleName="RemoteForwarder" />
<br /></Imports>
<br /><Startup>
<br /><Task commandLine="enableasp.cmd" taskType="background" executionContext="elevated" />
<br /></Startup>
<br /></WebRole>
<br /></ServiceDefinition>
<br />








Thanks a lot for this! I’m really glad to see Classic ASP running under Windows Azure.
ピンバック: Azure の Worker Role で Classic ASP を使う(HWC版) | たんたか