ASPX をコンソールで実行する方法 [.NET Framework]

aspx を自前のプログラムで実行できるよう、Hosting API (System.Web.Hosting 以下) が用意されています。 ここでは、試しに aspx を実行してコンソールに結果を返す EXE を作成してみましょう。

Hosting API の利用例

ソースコード

以下を HostingTest.cs として保存してください。

//
// HostingTest.cs
//
// Author: Dado-san
// http://keicode.com/
//


using System;
using System.Web;
using System.Web.Hosting;
using System.IO;


//////////////////////////////////////////////////////////////////////////


class HostingTest {

     public static void Main() {

          MyApplicationHost msh = 
               (MyApplicationHost) ApplicationHost.CreateApplicationHost (
                    typeof(MyApplicationHost), 
                    "/", 
                    Directory.GetCurrentDirectory()
               );
          
          msh.ProcessRequest ();
     }

}


/////////////////////////////////////////////////////////////////////////////


public class MyApplicationHost : MarshalByRefObject {

     public void ProcessRequest () {

          SimpleWorkerRequest swr 
               = new SimpleWorkerRequest (
                    "test1.aspx", 
                    "", 
                    Console.Out);
          
          HttpRuntime.ProcessRequest (swr);

     }

}

makefile は以下の通り。

TARGETNAME=HostingTest
SOURCE_FILE= HostingTest.cs
CSC = csc.exe
OUTDIR=.\chk

all: "$(OUTDIR)\$(TARGETNAME).exe"

igac:
	@gacutil /i $(OUTDIR)\$(TARGETNAME).exe /nologo
	@gacutil /l $(TARGETNAME) /nologo


ugac:
	@gacutil /u $(TARGETNAME) /nologo


"$(OUTDIR)" :
    @if not exist "$(OUTDIR)" mkdir "$(OUTDIR)"


CSC_OPT=\
	/nologo\
	/target:exe\
	/out:$(OUTDIR)\$(TARGETNAME).exe\
	/doc:$(OUTDIR)\$(TARGETNAME).xml\
	/debug+\
	/debug:full\
	/optimize-\
	/warn:4\
	/keyfile:key.snk


$(OUTDIR)\$(TARGETNAME).exe: "$(OUTDIR)" $(SOURCE_FILE) key.snk
	$(CSC) $(CSC_OPT) $(SOURCE_FILE)

key.snk:
	sn -k key.snk

ビルドと GAC への登録

上記コードを nmake でビルドした後、nmake igac でグローバルアセンブリキャッシュに登録します。

これにより、chk サブディレクトリに hostingtest.exe が作成されます。これは現在のディレクトリにある、 test1.aspx を実行します。

実行サンプル

ここでは以下のコードを test1.aspx として、nmake で作成された chk ディレクトリに保存してください。

<%@Page Language="C#" %>
<%
	
Response.Write("***** AppDomain Information *****\n");
Response.Write("BaseDirectory:      " + AppDomain.CurrentDomain.BaseDirectory + "\n");
Response.Write("DynamicDirectory:   " + AppDomain.CurrentDomain.DynamicDirectory + "\n");
Response.Write("FriendlyName:       " + AppDomain.CurrentDomain.FriendlyName + "\n");
Response.Write("RelativeSearchPath: " + AppDomain.CurrentDomain.RelativeSearchPath + "\n");


Response.Write("\n***** AppDomainSetup Information *****\n");

AppDomainSetup adsetup;
	
adsetup = AppDomain.CurrentDomain.SetupInformation;
Response.Write("ApplicationBase:   " + adsetup.ApplicationBase + "\n");
Response.Write("ApplicationName:   " + adsetup.ApplicationName + "\n");
Response.Write("CachePath:         " + adsetup.CachePath + "\n");
Response.Write("ConfigurationFile: " + adsetup.ConfigurationFile + "\n");
Response.Write("DynamicBase:       " + adsetup.DynamicBase + "\n");
Response.Write("LicenseFile:       " + adsetup.LicenseFile + "\n");
Response.Write("PrivateBinPath:    " + adsetup.PrivateBinPath + "\n");

%>

実行例

chk ディレクトリで、HostingTest.exe を実行します。以下のように、確かに aspx コードが実行されることが確認できます。

> HostingTest.exe
***** AppDomain Information *****
BaseDirectory:      C:\src\test\dotnet\hosting1\chk\
DynamicDirectory:   C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary 
ASP.NET Files\root\bcb351aa\322ae141
FriendlyName:       4eb1ec78-1-128716113532120000
RelativeSearchPath: C:\src\test\dotnet\hosting1\chk\bin

***** AppDomainSetup Information *****
ApplicationBase:   C:\src\test\dotnet\hosting1\chk\
ApplicationName:   322ae141
CachePath:         C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary 
ASP.NET Files\root\bcb351aa
ConfigurationFile: C:\src\test\dotnet\hosting1\chk\web.config
DynamicBase:       C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary 
ASP.NET Files\root\bcb351aa
LicenseFile:
PrivateBinPath:    C:\src\test\dotnet\hosting1\chk\bin

関連ページ

よくわかる IIS > ホステッドウェブコア API

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説