IISとCassini以外でASP.NETのホストができた
IISとCassini(Visual 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"; } } }
ディレクトリ構造
実行例
「NoNamed Document」て英語おかしい気がするけど、検証の為にころころ変えた結果なのでとくに意味はry。
それからWeb.configファイルとかはデフォルトで「C:\WINDOWS\Microsoft .NET\Frameworks\v2.hoge」あたりを見に行くようになってるので、標準のWeb.configファイルがそこにあるっぽい。HttpWorkerRequestのプロパティで指定できる。
問題点
ということで
ということで、これを拡張すればWindowsでもLinux, Mac OS Xでも、(同じexeファイルで)コマンド一発でASP.NETなWebアプリケーションが動かせる。
xsp2は魅力的だけど、WindowsはIISにホストさせないと動かない。めんどくさい。
*1:Visual Studio でも参照の追加をやらないといけない
*2:両方必要!