2012の25日目です。最終日なのにいそがしくてネタに走れず割と普通(そのままの意味)の内容になってしまってごめんなさい。アプリケーションでWebサーバーを立ててASP.NETをホストしたいというわけで今回は普通のアプリケーションつまり一般的な実行形式(.exe)なアプリケーションでWebサーバーを立てて、そこでASP.NETをホストしたいなーという話です。いうときにそんなものを使うのかというと例えばアプリケーションだけどリモートからちょっといじるようにWeb機能がついてるとかありますよね。VLCとか録画用ソフトとか。そのようなアプリケーションを自分で作った時にWebサーバーがあれこれ返すための実装はテンプレートエンジンがーとか色々と結構泥臭くなりがちです。ExpressやIISを使うまでもない超簡易的なWebサーバー機能を持たせたい、けれどWebサーバー機能のアプリケーションもASP.NETとかで書きたい、といった感じです。Webサーバーを組み込むというわけでまずはアプリケーションにWebサーバーを組み込んでみましょう。FrameworkにはHttpListenerクラスというWebサーバー機能を組み込むための便利なものがあるのでこれを使います。ちなみにこれはHTTP.sysというHTTPサーバー機能を提供するWindowsのカーネルモジュールを使うクラスです。HTTP.sysはIISやWinRMとか色々なもので使われています。能楽堂で使ってるEnnouとかもそうですね。いうわけで書いてみたのがこちら。}}とりあえず固定文字列を返すだけのものがさくっとできました。これで起動するとポート38080で待ち受けてブラウザでアクセスできるようになります。夢が広がり始めましたね。注意なところとしてHttpListenterの仕様上localhost以外を指定した場合(例えばIPアドレスや*など)や特定のポートを指定した場合には管理者権限などで起動してあげるか、下記のようにnetshコマンドを管理者権限で実行して許可する必要があります。user=HOMURA\TomoyoASP.NETをホストするでは次はASP.NETをアプリケーションでホストする方法についてです。ASP.NETはIISで動かす以外にもアプリケーションでホストする方法が用意されています。実はHTTPサーバーなしでも処理はできたりします。いうものがあるのでこれを使います。このメソッドはASP.NET用のAppDomainを作ってその中で指定したクラスをホスト用のインスタンスとして作って返します。いうわけでこれもさくっと例を。(AppDomainが生成されるときにNotFoundになる)のでコピーする。利用ちなみにCreateApplicationHostメソッドでWebアプリケーションのルートディレクトリを指定します。その指定したディレクトリ以下のファイルを実行することになります(IISのアプリケーションディレクトリみたいなもの)。WebサーバーとASP.NETのホスティングをくっつけるというわけで必要な要素はそろったのでこれを合体させます。実装する必要があるぐらいです(SimpleWorkerRequestだとちょっと足りないのです)。MVCアプリケーションも動作します。MVCにしろそのままでは完全に動作しないアプリケーションもあると思いますがそれでも全く動かないより全然よいと思います。コードはちょっと長くてここに書けないのでGitHubに上げておきましたのでご覧ください。大した分量でもなくコメントつけまくったので大体安心です。4のアプリケーションが動くサンプルはこちらです。https://github.com/mayuki/SimpleAspNetWebHost/raw/master/Build/SimpleAspNetWebHost-Sample-20121225.zipSimpleAspNetWebHost.exeを実行すると自動的にブラウザが開きます。4のテンプレートから生成されたものが入ってますが、適当にアプリを放り込めば自由に動かすことができます。いうことでぜひご活用ください。Expressを展開するのがよいのではないでしょうか。ちなみに何でこんなことを調べたのかというとこういうのを作ろうとしていたからでした。iTunesの曲をそのままWeb経由で再生するもので、iPadとかみたいに共有できない端末でも何とか聞けるようにみたいなのをやりたいなーと。いうツールなので起動するだけのお手軽なものだけどアプリ的な部分はWebなのでASP.NET使いたい!!みたいな感じでした。本当は間に合えばセットで公開するつもりでしたが余裕がなかったのでいつか...。ExplorerzshWebKitMetroWinRTWinJSリンクMisuzilla.orgぷろじぇくと、みすじら。