inohilog

/var/log/inohiro.log

IISとCassini以外でASP.NETのホストができた

IISCassiniVisual Studio 搭載の開発サーバー)以外でASP.NETのホストができた。ホストといっても、なんていうか処理してHTMLを返すだけですが。なんでこれまでやらなかったのかな、このへん。

コード

Host
using System;
using System.Web;
using System.Web.Hosting;

namespace ConsoleHosting
{
	public class ConsoleHoster : MarshalByRefObject
	{
		public void HandleRequest( string fileName )
		{
			Console.WriteLine( "======================================================" );
			HttpWorkerRequest worker = new SimpleWorkerRequest( fileName, "", Console.Out );
			System.Web.HttpRuntime.ProcessRequest( worker );
		}
	}

	public class Host
	{
		public static void Main( string[] args )
		{
			try
			{
				ConsoleHoster aspnetHost
					= ( ConsoleHoster )ApplicationHost.CreateApplicationHost( typeof( ConsoleHoster ), "/", @"C:\app" );
				aspnetHost.HandleRequest( "default.aspx" );
			}
			catch ( Exception exp )
			{
				Console.WriteLine( exp.ToString() );
			}

			Console.ReadKey();
		}
	}
}
default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>NoNamed Document</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
		<asp:Label runat="server" ID="helloLabel" />
    </div>
    </form>
</body>
</html>
default.aspx.cs
using System;

namespace WebApplication1
{
	public partial class _Default : System.Web.UI.Page
	{
		protected void Page_Load( object sender, EventArgs e )
		{
			this.helloLabel.Text = "Hello, World";
		}
	}
}

ディレクトリ構造

親ディレクトリ(C:\app)

default.aspx(default.aspx, default.aspx.cs, default.aspx.designer.cs)。

「Properties」ディレクトリとか必要かなとおもって適当にコピーしたが、もしかしたら無くても動くかもしれない。

子ディレクトリ(C:\app\bin)

上記のコードをコンパイルして得た実行可能ファイルと、親ディレクトリのdefault.aspxをコンパイルしたDll。

実行例


「NoNamed Document」て英語おかしい気がするけど、検証の為にころころ変えた結果なのでとくに意味はry。
それからWeb.configファイルとかはデフォルトで「C:\WINDOWS\Microsoft .NET\Frameworks\v2.hoge」あたりを見に行くようになってるので、標準のWeb.configファイルがそこにあるっぽい。HttpWorkerRequestのプロパティで指定できる。

問題点

  • Mac OS X でHostプログラムのコンパイルができない。
    • System.Web.Hosting 名前空間がないよって言われる*1
    • System.Web.Hosting 名前空間Windows環境依存で、Monoでは実装されてないんじゃないかな、みたいな気がするんだけど、単純に参照がないだけか。。。?
    • 解決策:アセンブリ(参照)の追加
  • aspxファイルのプリコンパイルが必要
    • aspxファイルをコンパイルしたDll(aspxファイルに関連づけられたメソッドとかがコンパイルされてる)と、元のaspxファイルが必要*2
    • 動的にコンパイルするには(Visual Studio でいう、Webアプリケーションプロジェクトではなく、Webサイトプロジェクト)どうすればいいんだろうか。
    • まあプリコンパイルしたDllをくっつければ特に問題ないんだけど
  • Mac OS X(Monoコマンド)で動作するか確認してない
    • やってみる
  • 「Default.aspx」と「default.aspx」の区別
    • Windows だから仕方ないね。

ということで

ということで、これを拡張すればWindowsでもLinux, Mac OS Xでも、(同じexeファイルで)コマンド一発でASP.NETなWebアプリケーションが動かせる。
xsp2は魅力的だけど、WindowsIISにホストさせないと動かない。めんどくさい。

*1:Visual Studio でも参照の追加をやらないといけない

*2:両方必要!