Веб-формы ASP.NET и ASP.NET MVC в ладу друг с другом - Развертывание IIS

ОГЛАВЛЕНИЕ

Развертывание IIS

Размещение веб-приложения ASP.NET MVC на хостинге: Если вы или ваш поставщик услуг хостинга имеете доступ к настройкам веб-сервера, можно создать шаблонную карту скрипта, чтобы иметь полную поддержку маршрутизации. Шаблонная карта скрипта позволяет увязать каждый входящий запрос с каркасом ASP.NET. Знайте, что эта опция передает каждый запрос в каркас ASP.NET (даже изображения и файлы CSS!), и может ухудшить производительность. Если у вас нет доступа к настройкам веб-сервера, можно изменить таблицу маршрутов, чтобы использовать расширения файлов. Вместо того чтобы выглядеть так:/Home/Index, URL будут выглядеть так: /Home.aspx/Index. При этом не надо конфигурировать веб-сервер. Однако придется внести некоторые изменения в таблицу маршрутов приложения.

Не надо ничего конфигурировать, если сервер IIS 7.0 работает в едином режиме.

Создание шаблонной карты скрипта в IIS 7.0

Шаблонная карта скрипта в IIS 7.0 активируется так:
1.    Запустить менеджер IIS.
2.    В древовидном меню «Подключения» выбрать приложение.
3.    Убедиться, что в нижней панели инструментов выбран вид «Свойства».
4.    Дважды щелкнуть по ярлыку «Привязки» обработчика.
5.    В окне «Действия» нажать кнопку «Добавить шаблонную карту скрипта».
6.    Ввести путь к файлу aspnet_isapi.dll, обычно расположенному в: %windir%Microsoft.NETFrameworkv2.0.50727aspnet_isapi.dll.
7.    Ввести имя ASP.NET MVC.
8.    Нажать кнопку OK.

После этого любой запрос к данному конкретному веб-сайту будет исполняться механизмом ASP.NET.

Создание шаблонной карты скрипта в IIS 6.0

Шаблонная карта скрипта в IIS 6.0 активируется так:
1.    Запустить менеджер IIS.
2.    Щелкнуть правой кнопкой мыши по веб-сайту и выбрать «Свойства».
3.    Выбрать вкладку «Основной каталог».
4.    Около настроек приложения нажать кнопку «Конфигурация».
5.    Выбрать вкладку привязки.
6.    Около шаблонных карт приложения нажать кнопку «Вставить».
7.    Ввести путь к файлу aspnet_isapi.dll, обычно расположенному в %windir%Microsoft.NETFrameworkv2.0.50727aspnet_isapi.dll.
8.    Снять флажок « Убедиться, что файл существует».
9.    Нажать кнопку OK.

После выполнения этих шагов любой запрос к данному конкретному веб-сайту будет исполняться механизмом ASP.NET.

Заставить Visual Studio предлагать элементы MVC

Есть одно различие между родным проектом веб-приложения MVC и “улучшенным” проектом веб-форм. При добавлении шаблона представления с помощью диалогового окна «Добавить новый элемент» Visual Studio не предлагает страницу представления MVC или любые другие элементы, характерные для MVC. И при щелчке правой кнопкой мыши внутри метода действия не дается возможность добавить представление, потому что Visual Studio не понимает, что разрабатывается проект ASP.NET MVC.

Для решения этого надо добавить указание типа проекта для Visual Studio. Это легко делается с несколькими предосторожностями.

Осторожно: Прежде чем отважиться на это, сделайте резервную копию файла проекта (т.е. файла с расширением .csproj). Если неправильно отредактировать файл проекта, Visual Studio не сможет открыть его.

В проводнике решения щелкните правой кнопкой мыши по имени проекта и выберите «Выгрузить проект». Снова щелкните правой кнопкой мыши по имени проекта и выберите «Редактировать <вашпроект>.csproj (замените содержимое угловых скобок на имя вашего проекта). Выведется файл XML .csproj. Найдите узел <projecttypeguids>, содержащий разделенный точками с запятой ряд глобально уникальных идентификаторов, и добавьте следующее значение перед остальными: {603c0e0b-db56-11dc-be95-000d561079b0};. Не добавляйте никаких лишних пробелов или переводов строки. Если не хотите набирать GUID вручную, скопируйте и вставьте его из соответствующего раздела любого правильного файла ASP.NET MVC .csproj, имеющегося где-либо еще. Сохраните обновленный файл .csproj. Затем перезагрузите проект, щелкнув правой кнопкой мыши по его имени в «Проводнике решения» и выбрав «Перезагрузить проект».

Если вы получите ошибку “Эта установка не поддерживает данный тип проекта”, то вы неправильно набрали GUID или не установили каркас MVC на компьютер. Если вы получите ошибку “Не удается прочитать файл проекта”, то нажмите OK и снова выберите «Перезагрузить проект». По неясным причинам ошибка сама устранится.

Теперь специфичные для MVC элементы появятся в диалоговом окне «Добавить новый элемент» наряду с обычными элементами веб-форм, и можно будет щёлкнуть правой кнопкой мыши внутри метода действия и выбрать «Добавить представление».

Стратегия переноса

Необходимо учесть следующие моменты при переносе существующего приложения ASP.NET в ASP.NET MVC:
1.    Спланировать процесс. Не переносить за один раз. Выбрать область и произвести перенос.
2.    ASP.NET MVC2 (предварительный просмотр) позволяет создавать приложения в "областях". Области предоставляют средства группировки контроллеров и представлений, чтобы обеспечить построение подразделов большого приложения, отделенных от остальных разделов.
3.    Разработать маршруты для новых областей.
4.    Перенести представления. Приложения веб-форм имеют файлы отделенного кода, что не поощряется в ASP.NET MVC. Но в подобных ситуациях можно оставить файлы отделенного кода и заставить приложение работать.
5.    Для тренировки создайте контроллеры и добавьте действия для каждого события, возбуждаемого в представлении.
6.    Так как абстракция является основой конструкции MVC, можно писать сценарии блочных тестов по мере переноса функционала.
7.    В блочных тестах отделить все конкретные зависимости в отделенный код и перенести его в контроллер. Некоторые из зависимостей - сессия, кэш, HttpContext(контекст Http) (связанные методы), хранилище, и т.д.
8.    После того как тест успешно пройдет, с помощью здравого смысла решите, стоит ли использовать отделенный код.
9.    Продолжить процесс для остального функционала.

Обработка устаревших URL

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

Это делается путем создания специального маршрута. Все маршруты наследуются от RouteBase. Унаследуйте устаревший маршрут от RouteBase и переопределите метод GetRouteData(..). Допустим, имеется URL http://yourdomain.com/profile.aspx?id=specialid. Для понимания процесса ниже приведен элементарный пример:

using System;
using System.Web;
using System.Web.Routing;

namespace CoolControls.Routes
{
  public class LegacyUrlRoute : RouteBase
  {
       public override RouteData GetRouteData(HttpContextBase httpContext)
       {
          const string status = "301 Moved Permanently";
          var request = httpContext.Request;
          var response = httpContext.Response;
          var name = "";
          var legacyUrl = request.Url.ToString();
          var newUrl = "";
          var id = request.QueryString.Count != 0 ? request.QueryString[0] : "";
         
          if (legacyUrl.ToLower().Contains("profile.aspx")) 
          {
                var rep = new ProfileRepository();
                var pro = rep.GetProfile(Convert.ToInt32(id));
               
                name = pro.Name;
               
                newUrl = "profile/" +  name;
                response.Status = status;
                response.RedirectLocation = newUrl;
                response.End();
          }
            return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext,
                                    RouteValueDictionary values)
    {
          return null;
    }
  }
}

Код состояния HTTP информирует пользовательских агентов (браузеры и поисковые машины), что ресурс, который они ищут, был перемещен в другое место. Для существующих ссылок это не должно иметь значения.

Если запрошенный URL не содержит "profile.aspx", возвращается null, чтобы UrlRoutingModule мог продолжить попытки сопоставить URL с другими маршрутами в коллекции RouteTable.Routes.
Последняя задача - зарегистрировать LegacyUrlRoute в RouteTable приложения. Это делается в самом начале метода в Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
     ......
     routes.Add(new LegacyUrlRoute());
     .......
}

Теперь при приходе запроса к старому URL, такому как http://mysocialnetwork.com/profile.aspx?id= 101, он автоматически перенаправляется на http://mysocialnetwork.com/profile/rajesh с правильным заголовком, отправленным пользовательскому агенту. Это можно проверить с помощью отладчика HTTP, такого как Fiddler.

Любопытные особенности

Согласие между веб-формами и ASP.NET MVC не столь сложное, как кажется. Оно дает прекрасные знания и приносит пользу в проектах переноса.

Следующая серия статей будет посвящена созданию сквозного приложения с предположительно лучшими практиками, использующего базовый подход с ориентацией на тестирование.

Заключение

Некоторые доводы, например, такие как использование файлов отделенного кода в ASP.NET MVC, могут вызвать у кого-то несогласие, однако они имеют место в области переноса, и решение об их переносе принимает разработчик исходя из потребности и сроков. Не считайте это незыблемым правилом. Используйте здравый смысл.