Использование ASP.NET MVC с разными версиями служб IIS (VB)

от Майкрософт

В этом руководстве описано, как использовать ASP.NET MVC и маршрутизацию URL-адресов с разными версиями служб IIS. Вы узнаете о различных стратегиях использования ASP.NET MVC с IIS 7.0 (классический режим), IIS 6.0 и более ранними версиями IIS.

Платформа ASP.NET MVC зависит от ASP.NET маршрутизации для маршрутизации запросов браузера к действиям контроллера. Чтобы воспользоваться преимуществами маршрутизации ASP.NET, может потребоваться выполнить дополнительные действия по настройке на веб-сервере. Все зависит от версии служб IIS и режима обработки запросов для приложения.

Ниже приведена сводка по различным версиям СЛУЖБ IIS.

  • IIS 7.0 (интегрированный режим) — не требуется специальная конфигурация для использования ASP.NET маршрутизации.
  • IIS 7.0 (классический режим) — для использования маршрутизации ASP.NET необходимо выполнить специальную настройку.
  • IIS 6.0 или более поздней версии. Для использования маршрутизации ASP.NET необходимо выполнить специальную настройку.

Последняя версия IIS — версия 7.5 (в Win7). СЛУЖБЫ IIS 7 входят в состав Windows Server 2008 И VISTA/SP1 и более поздних версий. Вы также можете установить IIS 7.0 в любой версии операционной системы Vista, кроме Home Basic (см. раздел https://technet.microsoft.com/library/cc731179%28WS.10%29.aspx).

IIS 7.0 поддерживает два режима обработки запросов. Можно использовать интегрированный или классический режим. При использовании IIS 7.0 в интегрированном режиме выполнять какие-либо особые действия по настройке не требуется. Однако при использовании IIS 7.0 в классическом режиме необходимо выполнить дополнительную настройку.

Microsoft Windows Server 2003 включает IIS 6.0. Невозможно обновить IIS 6.0 до IIS 7.0 при использовании операционной системы Windows Server 2003. При использовании 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 может обрабатывать запросы с помощью двух разных режимов обработки запросов: интегрированного и классического. Интегрированный режим обеспечивает более высокую производительность и больше возможностей. Классический режим включен для обратной совместимости с более ранними версиями IIS.

Режим обработки запросов определяется пулом приложений. Вы можете определить, какой режим обработки используется конкретным веб-приложением, определив пул приложений, связанный с приложением. Выполните следующие действия.

  1. Запуск диспетчера служб IIS
  2. В окне Подключения выберите приложение.
  3. В окне Действия щелкните ссылку Основные параметры , чтобы открыть диалоговое окно Изменение приложения (см. рис. 1).
  4. Запишите выбранный пул приложений.

По умолчанию службы IIS настроены для поддержки двух пулов приложений: DefaultAppPool и классического пула приложений .NET. Если выбран параметр DefaultAppPool, приложение выполняется в режиме обработки интегрированных запросов. Если выбран классический пул приложений .NET, приложение выполняется в классическом режиме обработки запросов.

Снимок экрана: диалоговое окно

Рис. 1. Обнаружение режима обработки запроса (щелкните для просмотра полноразмерного изображения)

Обратите внимание, что режим обработки запросов можно изменить в диалоговом окне Изменение приложения. Нажмите кнопку Выбрать и измените пул приложений, связанный с приложением. Учтите, что при переходе ASP.NET приложения из классического в интегрированный режим существуют проблемы совместимости. Дополнительные сведения см. в следующих статьях:

Если приложение ASP.NET использует DefaultAppPool, вам не нужно выполнять никаких дополнительных действий, чтобы обеспечить работу ASP.NET маршрутизации (и, следовательно, ASP.NET MVC). Однако если приложение ASP.NET настроено для использования классического пула приложений .NET, а затем продолжить чтение, вам предстоит выполнить дополнительные действия.

Использование ASP.NET MVC с более ранними версиями IIS

Если вам нужно использовать ASP.NET MVC с более старой версией IIS, чем IIS 7.0, или необходимо использовать IIS 7.0 в классическом режиме, то у вас есть два варианта. Во-первых, можно изменить таблицу маршрутов для использования расширений файлов. Например, вместо запроса URL-адреса, такого как /Store/Details, следует запросить URL-адрес, например /Store.aspx/Details.

Второй вариант — создать так называемую карту скрипта с подстановочными знаками. Схема скрипта с подстановочными знаками позволяет сопоставлять каждый запрос с платформой ASP.NET.

Если у вас нет доступа к веб-серверу (например, ASP.NET приложение MVC размещается у поставщика услуг Интернета), необходимо использовать первый вариант. Если вы не хотите изменять внешний вид URL-адресов и у вас есть доступ к веб-серверу, можно использовать второй вариант.

Мы подробно рассмотрим каждый вариант в следующих разделах.

Добавление расширений в таблицу маршрутизации

Самый простой способ получить ASP.NET маршрутизации для работы с более старыми версиями IIS — изменить таблицу маршрутов в файле Global.asax. В файле 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.

Снимок экрана: окно Microsoft Internet Обозреватель с ошибкой 404 Не найдено.

Рис. 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.

Измененный файл Global.asax в листинге 2 работает с более старыми версиями 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

Важно! Не забудьте снова создать ASP.NET приложение MVC после изменения файла Global.asax.

В листинге 2 в файл Global.asax внесены два важных изменения. Теперь в Global.asax определены два маршрута. Шаблон URL-адреса для маршрута по умолчанию, первого маршрута, теперь выглядит следующим образом:

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

Добавление расширения MVC изменяет тип файлов, которые перехватывает модуль маршрутизации ASP.NET. Благодаря этому изменению приложение ASP.NET MVC теперь направляет запросы, подобные следующим:

/Home.mvc/Index/

/Product.mvc/Details/3

/Product.mvc/

Второй маршрут, корневой маршрут, является новым. Этот шаблон URL-адреса для корневого маршрута является пустой строкой. Этот маршрут необходим для сопоставления запросов, выполненных с корнем приложения. Например, корневой маршрут будет соответствовать запросу, который выглядит следующим образом:

http://www.YourApplication.com/

После внесения этих изменений в таблицу маршрутов необходимо убедиться, что все ссылки в приложении совместимы с этими новыми шаблонами URL-адресов. Иными словами, убедитесь, что все ссылки содержат расширение MVC. Если для создания ссылок используется вспомогательный метод Html.ActionLink(), вносить изменения не нужно.

Вместо использования скрипта registermvc.wcf можно добавить в IIS новое расширение, которое сопоставляется с платформой ASP.NET вручную. При самостоятельном добавлении нового расширения убедитесь, что флажок Проверить наличие файла не установлен.

Размещенный сервер

У вас не всегда есть доступ к веб-серверу. Например, если вы размещаете приложение ASP.NET MVC с помощью поставщика услуг размещения в Интернете, у вас не обязательно будет доступ к СЛУЖБАм IIS.

В этом случае следует использовать одно из существующих расширений файлов, сопоставленных с платформой ASP.NET. Примеры расширений файлов, сопоставленных с ASP.NET включают расширения ASPX, AXD и ASHX.

Например, измененный файл Global.asax в листинге 3 использует расширение ASPX вместо расширения MVC.

Листинг 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

Файл Global.asax в листинге 3 точно такой же, как и предыдущий файл Global.asax, за исключением того факта, что в нем используется расширение ASPX вместо расширения MVC. Вам не нужно выполнять настройку на удаленном веб-сервере, чтобы использовать расширение ASPX.

Создание схемы скриптов с подстановочными знаками

Если вы не хотите изменять URL-адреса для приложения MVC ASP.NET и у вас есть доступ к веб-серверу, у вас есть дополнительный вариант. Вы можете создать карту скриптов с подстановочными знаками, которая сопоставляет все запросы к веб-серверу с платформой ASP.NET. Таким образом, можно использовать ASP.NET таблице маршрутов MVC по умолчанию с IIS 7.0 (в классическом режиме) или IIS 6.0.

Имейте в виду, что этот параметр приводит к перехвату служб IIS каждого запроса, сделанного к веб-серверу. Сюда входят запросы на изображения, классические страницы ASP и HTML-страницы. Таким образом, включение сопоставления скрипта с подстановочными знаками для ASP.NET влияет на производительность.

Вот как можно включить схему скрипта с подстановочными знаками для IIS 7.0:

  1. Выберите приложение в окне Подключения.
  2. Убедитесь, что выбрано представление "Функции ".
  3. Дважды щелкните кнопку Сопоставления обработчика
  4. Щелкните ссылку Добавить карту скрипта с подстановочными знаками (см. рис. 3)
  5. Введите путь к файлу aspnet_isapi.dll (этот путь можно скопировать из карты скрипта PageHandlerFactory)
  6. Введите имя MVC.
  7. Нажмите кнопку ОК .

Снимок экрана: окно диспетчера служб IIS 7 точки 0, в котором отображается диалоговое окно Добавление сопоставления скриптов с подстановочными знаками.

Рис. 3. Создание карты скрипта с подстановочными знаками с помощью IIS 7.0(щелкните для просмотра полноразмерного изображения)

Выполните следующие действия, чтобы создать карту скрипта с подстановочными знаками с помощью IIS 6.0.

  1. Щелкните правой кнопкой мыши веб-сайт и выберите Свойства.
  2. Выберите вкладку "Домашний каталог "
  3. Нажмите кнопку Конфигурация.
  4. Выберите вкладку Сопоставления .
  5. Нажмите кнопку Вставить (см. рис. 4)
  6. Вставьте путь к aspnet_isapi.dll в поле Исполняемый файл (этот путь можно скопировать из схемы скрипта для ASPX-файлов).
  7. Снимите флажок Проверить, существует ли файл.
  8. Нажмите кнопку ОК .

Снимок экрана: окно 6 точек 0 служб IIS, в котором отображается диалоговое окно

Рис. 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

Итоги

Цель этого руководства — объяснить, как можно использовать ASP.NET MVC при использовании более старой версии IIS (или IIS 7.0 в классическом режиме). Мы рассмотрели два метода ASP.NET маршрутизации для работы с более старыми версиями IIS: изменение таблицы маршрутов по умолчанию или создание карты скриптов с подстановочными знаками.

Первый вариант требует изменения URL-адресов, используемых в приложении MVC ASP.NET. Одним из важных преимуществ этого первого варианта является отсутствие доступа к веб-серверу для изменения таблицы маршрутов. Это означает, что вы можете использовать этот первый вариант даже при размещении приложения MVC ASP.NET в интернет-хостинг компании.

Второй вариант — создать карту скрипта с подстановочными знаками. Преимущество этого второго варианта заключается в том, что вам не нужно изменять URL-адреса. Недостаток этого второго варианта заключается в том, что он может повлиять на производительность приложения MVC ASP.NET.