さまざまなバージョンの 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 以降に含まれています。 また、ホーム 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 は 2 つのアプリケーション プール ( DefaultAppPoolクラシック .NET AppPool) をサポートするように構成されています。 DefaultAppPool が選択されている場合、アプリケーションは統合要求処理モードで実行されます。 クラシック .NET AppPool が選択されている場合、アプリケーションはクラシック要求処理モードで実行されています。

[アプリケーションの編集] ダイアログ ボックスのスクリーンショット。IIS が統合要求処理モードでアプリケーションを実行するように構成されていることを示しています。

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

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

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

ASP.NET MVC と古いバージョンの IIS の使用

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

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

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

各オプションの詳細については、次のセクションを参照してください。

ルート テーブルへの拡張機能の追加

古いバージョンの IIS で作業するためにルーティングを ASP.NET する最も簡単な方法は、Global.asax ファイル内のルート テーブルを変更することです。 リスト 1 の既定の Global.asax ファイルと変更されていない Global.asax ファイルは、Default ルートという名前の 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 のエラー ページが表示されます。

Microsoft Internet エクスプローラー ウィンドウのスクリーンショット。404 Not Found エラーが表示されています。

図 2: 404 Not Found エラーの受信 (クリックするとフルサイズの画像が表示されます)

古いバージョンの 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 に移動されました。

このスクリプトを実行すると、IIS に新しい .mvc 拡張機能が登録されます。 .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 番目のルートであるルート ルートは新しいルートです。 ルート ルートのこの URL パターンは空の文字列です。 このルートは、アプリケーションのルートに対して行われた要求を照合するために必要です。 たとえば、ルート ルートは、次のような要求と一致します。

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] ボタンをクリックします

[ワイルドカード スクリプト マップの追加] ダイアログ ボックスが表示されている[Internet Information Services Manager 7 point 0]\(インターネット インフォメーション サービス マネージャー 7 ポイント 0\) ウィンドウのスクリーンショット。

図 3: IIS 7.0 を使用したワイルドカード スクリプト マップの作成 (フルサイズの画像を表示する をクリックします)

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

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

Internet Information Services の [6 ポイント 0] ウィンドウのスクリーンショット。[アプリケーション拡張機能マッピングの編集] ダイアログ ボックスのスラッシュを表示しています。

図 4: IIS 6.0 を使用してワイルドカード スクリプト マップを作成する (フルサイズの画像を表示する をクリックします)

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

Microsoft Internet エクスプローラー ウィンドウのスクリーンショット。[ルートルートがありません] というエラーが表示されています。受信要求はどのルートにも一致しません。

図 5: ルート ルート エラーがありません (フルサイズの画像を表示する をクリックします)

リスト 4 - 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 = ""} _

            ) 

            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 を使用する方法を説明することでした。 古いバージョンの IIS で動作するように ASP.NET ルーティングを取得する 2 つの方法について説明しました。既定のルート テーブルを変更するか、ワイルドカード スクリプト マップを作成します。

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

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