次の方法で共有


さまざまなバージョンの IIS と共に ASP.NET MVC を使用する (VB)

提供元: Microsoft

このチュートリアルでは、ASP.NET MVC と URL ルーティングをさまざまなバージョンのインターネット インフォメーション サービスと連携させる方法について説明します。 IIS 7.0 (クラシック モード)、IIS 6.0 および以前のバージョンの IIS で ASP.NET MVC を使用するためのさまざまな方法について説明します。

ASP.NET MVC フレームワークは、ブラウザー要求をコントローラー アクションにルーティングする ASP.NET ルーティングに依存します。 ASP.NET ルーティングを利用するには、Web サーバーで追加の構成手順を実行する必要がある場合があります。 これはすべて、インターネット インフォメーション サービス (IIS) のバージョンとアプリケーションの要求処理モードによって異なります。

IIS のさまざまなバージョンの概要を次に示します。

  • IIS 7.0 (統合モード) - ASP.NET ルーティングを使用するために特別な構成は必要ありません。
  • IIS 7.0 (クラシック モード) - ASP.NET ルーティングを使用するには、特別な構成を実行する必要があります。
  • IIS 6.0 以前のバージョン - ASP.NET ルーティングを使用するには、特別な構成を実行する必要があります。

IIS の最新バージョンはバージョン 7.5 (Win7 の場合) です。 IIS の IIS 7 は、Windows Server 2008 および VISTA/SP1 以降に含まれています。 また、Home Basic を除く Vista オペレーティング システムの任意のバージョンに IIS 7.0 をインストールすることもできます (https://technet.microsoft.com/library/cc731179%28WS.10%29.aspx を参照)。

IIS 7.0 では、要求を処理するための 2 つのモードがサポートされています。 統合モードまたはクラシック モードを使用することができます。 IIS 7.0 を統合モードで使用する場合は、特別な構成手順を実行する必要はありません。 ただし、IIS 7.0 をクラシック モードで使用する場合は、追加の構成を実行する必要があります。

Microsoft Windows Server 2003 には IIS 6.0 が含まれています。 Windows Server 2003 オペレーティング システムを使用する場合、IIS 6.0 を IIS 7.0 にアップグレードすることはできません。 IIS 6.0 を使用する場合は、追加の構成手順を実行する必要があります。

Microsoft Windows XP Professional には IIS 5.1 が含まれています。 IIS 5.1 を使用する場合は、追加の構成手順を実行する必要があります。

最後に、Microsoft Windows 2000 と Microsoft Windows 2000 Professional には IIS 5.0 が含まれています。 IIS 5.0 を使用する場合は、追加の構成手順を実行する必要があります。

統合モードとクラシック モード

IIS 7.0 では、次の 2 つの要求処理モードを使用して要求を処理できます: 統合、クラシック。 統合モードでは、パフォーマンスが向上し、より多くの機能が提供されます。 クラシック モードは、以前のバージョンの IIS との下位互換性があります。

要求処理モードは、アプリケーション プールによって決定されます。 アプリケーションに関連付けられているアプリケーション プールを決定することで、特定の Web アプリケーションによって使用されている処理モードを判断できます。 次のステップを実行します。

  1. インターネット インフォメーション サービス マネージャを起動します
  2. [接続] ウィンドウで、アプリケーションを選択します
  3. [アクション] ウィンドウで、[基本設定] リンクをクリックして [アプリケーションの編集] ダイアログ ボックスを開きます (図 1 を参照)
  4. 選択したアプリケーション プールを書き留めます。

既定では、IIS は、DefaultAppPoolClassic .NET AppPool の 2 つのアプリケーション プールをサポートするように構成されています。 DefaultAppPool が選択されている場合、アプリケーションは統合された要求処理モードで実行されます。 Classic .NET AppPool が選択されている場合、アプリケーションはクラシック要求処理モードで実行されます。

Screenshot of the Edit Application dialog box, which is showing that IIS is configured to run the application in integrated request processing mode.

図 1: 要求処理モードの検出 (クリックするとフルサイズの画像が表示されます)

[アプリケーションの編集] ダイアログ ボックス内で要求処理モードを変更できることに注意してください。 [選択] ボタンをクリックし、アプリケーションに関連付けられているアプリケーション プールを変更します。 ASP.NET アプリケーションをクラシック モードから統合モードに変更するときに、互換性の問題があることに注意してください。 詳細については、次の記事をご覧ください。

ASP.NET アプリケーションで DefaultAppPool を使用している場合は、ASP.NET ルーティング (したがって MVC ASP.NET) を動作させるために追加の手順を実行する必要はありません。 ただし、ASP.NET アプリケーションが Classic .NET AppPool を使用するように構成されている場合は、追加の手順が必要です。引き続き、読み続けてください。

以前のバージョンの IIS で ASP.NET MVC を使用する

IIS 7.0 より古いバージョンの IIS で ASP.NET MVC を使用する必要がある場合、またはクラシック モードで IIS 7.0 を使用する必要がある場合は、2 つのオプションがあります。 1 つ目として、ファイル拡張子を使用するようにルート テーブルを変更できます。 たとえば、/Store/Details などの URL を要求する代わりに、/Store.aspx/Details などの URL を要求します。

2 つ目のオプションとして、"ワイルドカード スクリプト マップ" というものを作成します。 ワイルドカード スクリプト マップを使用すると、すべての要求を ASP.NET フレームワークにマップできます。

Web サーバーにアクセスできない場合 (たとえば、ASP.NET MVC アプリケーションがインターネット サービス プロバイダーによってホストされている場合など) は、最初のオプションを使用する必要があります。 URL の表示方法を変更する必要がなく、Web サーバーにアクセスできる場合は、2 番目のオプションを使用できます。

以降のセクションでは、各オプションについて詳しく説明します。

ルート テーブルに拡張子を追加する

ASP.NET ルーティングを古いバージョンの IIS と連携させる最も簡単な方法は、Global.asax ファイル内のルート テーブルを変更することです。 リスト 1 の既定の Global.asax ファイルと未変更の Global.asax ファイルは、"既定のルート" という名前の 1 つのルートを構成します。

リスト 1 - Global.asax (変更されない)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

リスト 1 で構成された既定のルートを使用すると、次のような URL をルーティングできます。

/Home/Index

/Product/Details/3

/Product

残念ながら、古いバージョンの IIS は、これらの要求を ASP.NET フレームワークに渡しません。 そのため、これらの要求はコントローラーにルーティングされません。 たとえば、URL /Home/Index に対してブラウザー要求を行うと、図 2 のエラー ページが表示されます。

Screenshot of the Microsoft Internet Explorer window, which is showing a 404 Not Found error.

図 2: 404 見つかりませんエラーの受信 (クリックするとフルサイズの画像が表示されます)

古いバージョンの IIS では、特定の要求のみが ASP.NET フレームワークにマップされます。 要求は、適切なファイル拡張子を持つ URL 用である必要があります。 たとえば、/SomePage.aspx の要求は、ASP.NET フレームワークにマップされますが、 /SomePage.htm の要求はそうではありません。

そのため、ASP.NET ルーティングを機能させるには、既定のルートを変更して、ASP.NET フレームワークにマップされているファイル拡張子が含まれるようにする必要があります。

これは、registermvc.wsf という名前のスクリプトを使用して行われます。 これは、ASP.NET MVC 1 リリースで C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts に含まれていましたが、ASP.NET 2 の時点で、このスクリプトは ASP.NET Futures に移行されました。

このスクリプトを実行すると、新しい .mvc 拡張子が IIS に登録されます。 .mvc 拡張子を登録したら、Global.asax ファイル内のルートを変更して、ルートで .mvc 拡張子が使用されるようにすることができます。

リスト 2 で変更された Global.asax ファイルは、古いバージョンの IIS で動作します。

リスト 2 - Global.asax (拡張子の変更)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}.mvc/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

重要: Global.asax ファイルを変更した後、ASP.NET MVC アプリケーションをもう一度ビルドすることを忘れないでください。

リスト 2 の Global.asax ファイルには、2 つの重要な変更点があります。 Global.asax に 2 つのルートが定義されるようになりました。 既定のルート (最初のルート) の URL パターンは次のようになります。

{controller}.mvc/{action}/{id}

.mvc 拡張子を追加すると、ASP.NET ルーティング モジュールがインターセプトするファイルの種類が変更されます。 この変更により、ASP.NET MVC アプリケーションは次のような要求をルーティングするようになりました。

/Home.mvc/Index/

/Product.mvc/Details/3

/Product.mvc/

2 番目のルート (Root ルート) は、新しいルートです。 Root ルートのこの URL パターンは、空の文字列です。 このルートは、アプリケーションのルートに対して行われた要求を照合するために必要です。 たとえば、Root ルートは、次のような要求と一致します。

http://www.YourApplication.com/

ルート テーブルにこれらの変更を加えた後、アプリケーション内のすべてのリンクがこれらの新しい URL パターンと互換性があることを確認する必要があります。 つまり、すべてのリンクに .mvc 拡張子が含まれていることを確認します。 Html.ActionLink() ヘルパー メソッドを使用してリンクを生成する場合は、変更を加える必要はありません。

registermvc.wcf スクリプトを使用する代わりに、手動で新しい拡張子を、ASP.NET フレームワークにマップされている IIS に追加できます。 新しい拡張子を自分で追加するときは、[ファイルの存在を確認する] というラベルのチェックボックスがオフになっていることを確認します。

ホストされたサーバー

常に Web サーバーにアクセスできるとは限りません。 たとえば、インターネット ホスティング プロバイダーを使用して ASP.NET MVC アプリケーションをホストしている場合、必ずしも IIS にアクセスできるわけではありません。

その場合は、ASP.NET フレームワークにマップされている既存のファイル拡張子のいずれかを使用する必要があります。 ASP.NET にマップされるファイル拡張子の例には、.aspx、.axd、.ashx などがあります。

たとえば、リスト 3 で変更された Global.asax ファイルでは、.mvc 拡張子ではなく.aspx 拡張子が使用されます。

リスト 3 - Global.asax (.aspx 拡張子に変更)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}.aspx/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

リスト 3 の Global.asax ファイルは、.mvc 拡張子の代わりに .aspx 拡張子を使用する点を除き、前の Global.asax ファイルとまったく同じです。 .aspx 拡張子を使用するために、リモート Web サーバーでセットアップを実行する必要はありません。

ワイルドカード スクリプト マップを作成する

ASP.NET MVC アプリケーションの URL の変更を希望せず、Web サーバーにアクセスできる場合は、別のオプションがあります。 Web サーバーに対するすべての要求を ASP.NET フレームワークにマップする、ワイルドカード スクリプト マップを作成できます。 ここでは、IIS 7.0 (クラシック モード) または IIS 6.0 で、既定の ASP.NET MVC ルート テーブルを使用できます。

このオプションにより、IIS は Web サーバーに対して行われたすべての要求をインターセプトすることに注意してください。 これには、イメージ、従来の ASP ページ、および HTML ページの要求が含まれます。 そのため、ASP.NET に対してワイルドカード スクリプト マップを有効にすると、パフォーマンスに影響します。

IIS 7.0 のワイルドカード スクリプト マップを有効にする方法を次に示します。

  1. [接続] ウィンドウでアプリケーションを選択します
  2. 機能ビューが選択されていることを確認します
  3. [ハンドラー マッピング] ボタンをダブルクリックします
  4. [ワイルドカード スクリプト マップの追加] リンクをクリックします (図 3 を参照)
  5. aspnet_isapi.dll ファイルへのパスを入力します (PageHandlerFactory スクリプト マップからこのパスをコピーできます)。
  6. 名前に「MVC」と入力します
  7. [OK] ボタンをクリックします

Screenshot of the Internet Information Services Manager 7 point 0 window, which is showing the Add Wildcard Script Map dialog box.

図 3: IIS 7.0 でのワイルドカード スクリプト マップの作成 (クリックするとフルサイズの画像が表示されます)

IIS 6.0 でワイルドカード スクリプト マップを作成するには、次の手順に従います。

  1. Web サイトを右クリックし、[プロパティ] を選択します
  2. [ホーム ディレクトリ] タブを選択します
  3. [構成] ボタンをクリックします
  4. [マッピング] タブを選択します
  5. [挿入] ボタンをクリックします (図 4 を参照)
  6. aspnet_isapi.dll へのパスを [実行可能ファイル] フィールドに貼り付けます (このパスは、.aspx ファイルのスクリプト マップからコピーできます)
  7. [ファイルの存在を確認する] というチェックボックスをオフにします
  8. [OK] ボタンをクリックします

Screenshot of the Internet Information Services 6 point 0 window, which is showing the Add slash Edit Application Extension Mapping dialog box.

図 4: IIS 6.0 でのワイルドカード スクリプト マップの作成 (クリックするとフルサイズの画像が表示されます)

ワイルドカード スクリプト マップを有効にしたら、Global.asax ファイル内のルート テーブルを Root ルートを含めるように変更する必要があります。 そうしないと、アプリケーションのルート ページの要求を行ったときに、図 5 のエラー ページが表示されます。 変更された Global.asax ファイルをリスト 4 で使用できます。

Screenshot of the Microsoft Internet Explorer window, which is showing the Missing Root route error: The incoming request does not match any route.

図 5: Root ルートの不足エラー (クリックするとフルサイズの画像が表示されます)

リスト 4 - Global.asax (Root ルートの変更)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

IIS 7.0 または IIS 6.0 用にワイルドカード スクリプト マップを有効にすると、次のような既定のルート テーブルで機能する要求を行うことができます。

/

/Home/Index

/Product/Details/3

/Product

まとめ

このチュートリアルでは、古いバージョンの IIS (またはクラシック モードの IIS 7.0) の使用時の ASP.NET MVC の使用方法について説明しました。 ASP.NET ルーティングを以前のバージョンの IIS で動作させる次の 2 つの方法 (既定のルート テーブルを変更するか、ワイルドカード スクリプト マップを作成する) を紹介しました。

最初のオプションでは、ASP.NET MVC アプリケーションで使用される URL を変更する必要があります。 この最初のオプションの非常に大きな利点の 1 つは、ルート テーブルを変更するために Web サーバーにアクセスする必要がないということです。 つまり、この最初のオプションは、インターネット ホスティング会社が ASP.NET MVC アプリケーションをホストする場合でも、使用できます。

2 つ目のオプションは、ワイルドカード スクリプト マップの作成です。 この 2 つ目のオプションの利点は、URL を変更する必要がないということです。 この 2 番目のオプションの欠点は、ASP.NET MVC アプリケーションのパフォーマンスに影響を与える可能性があるということです。