Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

CD-ROMから起動できるWebアプリケーション環境の構築

.NET Frameworkで実装された簡易WebサーバCassiniを利用する

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/07/29 12:00

.NET Frameworkで実装された簡易WebサーバCassiniを利用することで、CD-ROMから起動できるWebアプリケーション環境を構築することができます。

はじめに

 数年前のことですが、CD-ROMに数万件のデータと検索システムを一緒に焼いて全国の営業所に配布したい、という話がありました。検索システムはインストールすることなくCD-ROM上から利用できることが条件で、検索自体はあまり複雑ではありませんでした。この話を聞いたとき、「CD-ROMからWebアプリケーションが実行できればシステムを作るのは簡単なのに……」と考えたものです。結局その話は丁重にお断りしてしまったのですが、今なら即座に引き受けることができます。

 なぜなら、私の手元にCassiniがあるからです。

対象読者

 .NET Frameworkを用いてWebアプリケーションを開発している方。

必要な環境

 .NET FrameworkをインストールしたWindowsマシン

サンプルをCD-ROM上から実行する

 サンプルの「Cassini_Sample」フォルダの内容をそのままCD-ROMに焼いてください。CD-ROMを挿入すると自動的にコマンドプロンプトが表示され、Webサーバが起動します。画面の指示どおりに[Enter]キーを入力すると、Webアプリケーション(1から100までの間のひとつの数字を当てるゲーム)が起動します。なお、コマンドプロンプトで再度[Enter]キーを押すと、Webサーバが終了します。

補足説明
 Windows XP SP2では、Cassiniの実行時に[Windowsセキュリティの重要な警告]ダイアログボックスが表示されることがあります。この場合は、[ブロックを解除する]ボタンを押して、ブロックを解除してください。
起動画面
起動画面
サンプルWebアプリ
サンプルWebアプリ

 このWebアプリケーションは、「Web.Config」の設定やSessionオブジェクトを利用して実装しています。Cassiniを利用することでASP.NETアプリケーションが実際に動作することを確認できます。

Cassiniとは

 Cassiniは、.NET Framework上で実装された簡易Webサーバのサンプルです。Cassiniを利用することで、IISがない環境でもASP.NETアプリケーションを実行することができます。実際、無償のASP.NET開発ツールであるWeb Matrixでは内部的にCassiniが使われています。Cassiniを利用するに当たっては、ASP.NET サンプル ソース ライセンシング プログラムを読んで使用条件を確認してください。

Cassiniを実行する

 Cassiniを入手するには、こちらの「Download ASP.NET Cassini Sample Web Serve」というページからリンクをたどって「Cassini.exe」をダウンロードします。

 この「Cassini.exe」を実行すると、デフォルトでは「C:\Cassini」フォルダにソースファイルや実行ファイルが展開されます。「ReadMe.txt」では「build.bat」を実行して、ソースの再コンパイルと「Cassini.dll」ファイルをグローバルアセンブリキャッシュに登録することが必要なように記述されていますが、必ずしもこの作業は必要ではありません。ここでは展開されたファイルをそのまま利用します。

 まず、Webアプリケーションのルートとなるフォルダを用意しましょう。サンプルソースに含まれている「Web」フォルダ以下を、Cドライブの直下にコピーします。この「Web」フォルダがWebアプリケーションのルートとなります。「Web」フォルダの下に「bin」フォルダがあり、そこに「Cassini.dll」が存在していることを確認してください。

 準備ができたら、「C:\Cassini」フォルダの「CassiniWebServer.exe」を実行します。[Application Directory]に「C:\Web」、[Server Port]に「8080」、[Virtual Root]に「/」を入力し、[Start]ボタンを押してください。Cassini Webサーバを起動すると、一番下にリンクボタンが表示されます。

CassiniWebServer
CassiniWebServer

 リンクボタンをクリックすると、Webアプリケーションが起動します。Cassiniを終了するには、「CassiniWebServer.exe」で[Stop]ボタンを押してください。

 ここではサンプルで作成したWebアプリケーションを実行していますが、VisualStudio.NETで作成した別のWebアプリケーションを実行することも可能です。「bin」フォルダに「Cassini.dll」をコピーして、起動時にWebアプリケーションのルートフォルダを指定すればCassiniがVisualStudio.NETで作成したWebアプリケーションを実行してくれるので試してみてください。

補足説明
 CassiniからWebアプリケーションを実行した場合、実行ユーザはログインしているユーザになります。ファイルやデータベースにアクセスするWebアプリケーションの場合、実行ユーザの権限の違いでうまく実行できないことがあるので注意してください。

Cassiniを起動するプログラムの作成

 「CassiniWebServer.exe」からWebアプリケーションを実行する場合、[Application Directory]に絶対パスを入力する必要があります。CD-ROMなどから実行する場合、使う人がCD-ROMのドライブ名やフォルダを指定しないといけないというのは不便です。そこでサンプルでは、自分と同じ場所にある「Web」フォルダをルートフォルダとして起動するプログラムを作成しています。

CassiniStarter.cs

using System;
using System.Diagnostics;
using System.IO;
using Cassini;
using System.Threading;

public class ProcessTest {

    // WebサーバのデフォルトのPort
    static int port = 8080;
    // Webアプリケーションのデフォルトで起動するファイル
    static string firstPage = "default.aspx";

    public static void Main(string[] args) {

        // 起動したフォルダにあるWebフォルダをルートフォルダに指定する
        string physicalPath =
            Path.Combine(Environment.CurrentDirectory, "Web");
        string virtualPath = "/";
        Server myWebServer;

        // 引数としてPort番号を渡された場合は
        // そのPortでWebサーバを起動する
        if(args.Length>0)
        {
            bool isNumeric = true;

            for(int i=0;i<args[0].Length && isNumeric;i++)
            {
                isNumeric = Char.IsDigit(args[0], i);
            }

            if(isNumeric)
                port = int.Parse(args[0]);
            else
            {
                Console.WriteLine("Port番号を正しく指定してください");
                Console
                    .Write("終了するにはEnterキーを入力してください");
                Console.ReadLine();
                return;
            }
        }

        try
        {
            // Cassiniを起動する
            myWebServer = new Server(port, virtualPath, physicalPath);
            myWebServer.Start();
        }
        catch
        {
            Console.WriteLine("簡易Webサーバが起動できませんでした");
            Console.Write("終了するにはEnterキーを入力してください");
            Console.ReadLine();
            return;
        }

        Console.WriteLine("簡易Webサーバを起動しました");
        Console.Write(
            "Enterキーを入力するとアプリケーションを開始します");
        Console.ReadLine();

        // Webアプリケーションを起動する
        Thread myThread = new Thread(new ThreadStart(newThreadRun));
        myThread.Start();

        Console.WriteLine("\r\nアプリケーションを開始しました");
        Console.Write(
            "簡易Webサーバを終了するにはEnterキーを入力してください");
        Console.ReadLine();

        myWebServer.Stop();
    }

    // スレッドを分けないとProcess.Startが
    // URLを正しく解釈してくれなかったため、別スレッドから実行している
    static private void newThreadRun()
    {
        string startupPage = String.Format("http://localhost:{0}/{1}",
            port, firstPage);
        Process.Start(startupPage);
    }
}

 「CassiniStarter.cs」をコンパイルするには「Cassini.dll」を参照する必要があります。また、実行時に「CassiniStater.exe」と「Cassini.dll」は同じフォルダになければいけません。「Cassini.dll」はWebアプリケーションの「bin」フォルダにもないといけないので、2つの「Cassini.dll」を利用することになります。

CD-ROMからの自動起動

 CD-ROMから自動起動させるために「Autorun.inf」を作成しています。ここでは「CassiniStarter.exe」を実行するよう指定しているだけです。

まとめ

 Cassiniは、9つのソースファイルで合計約2千行のそれほど大きなアプリケーションではありませんから、ソースコードをひととおり読んでみるのも面白いと思います。デフォルトでは、Cassini Webサーバには起動したマシンからしかアクセスできませんが、その制限を解除する方法は公開されています。ただし、IISのようにいくつものWebアプリケーションを同時に稼動することはできませんし、セキュリティ面でも問題があります。

 こういった点を理解して使い方を吟味すれば、Cassiniを利用することでWebアプリケーションの活躍する場が広がるでしょう。ここではCD-ROMから起動する方法をご紹介しましたが、USBメモリにWebアプリケーションを入れて持ち歩くといったことも可能です。

 ぜひ自分なりの有効な活用方法を探してみてください。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 小野 修司(オノ シュウジ)

    MVP for Visual Developer - Visual C# あおい情報システム株式会社勤務。 .NETに関する話題を扱う「どっとねっとふぁん」を運営。 &nbsp;

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5