Маршрутизация URL
72ASP.NET --- Веб-сайты ASP.NET --- Маршрутизация URL
В основу модели карты сайта положен простой принцип: каждая запись имеет отдельный URL-адрес. Хотя URL-адреса можно различать, добавляя аргументы строки запроса, во многих веб-сайтах существует однозначное соответствие между веб-формами и записями карты сайта.
Когда это не подходит, ASP.NET предоставляет два инструмента, которые могут помочь в решении задачи. Первый из них - отображение URL-адресов, которое представляет собой простой способ сопоставления одного URL-адреса с другим. Второй инструмент - маршрутизация URL-адресов, которая представляет собой более сложную, но и значительно более гибкую систему, выполняющую аналогичную задачу.
Отображение URL-адресов - идеальный способ выполнения "однонаправленной" переадресации. Например, отображение служит быстрым способом обработки старых или недавно перемещенных страниц, либо предоставления нескольких дополнительных точек входа для нескольких популярных страниц.
С другой стороны, маршрутизация URL-адресов может служить базисом для более сложной системы перенаправления, имеющей дело со значительно большим количеством страниц. Например, ее можно было бы использовать для замены длинных, сложных URL-адресов страниц товаров более простым синтаксисом и для реализации этого подхода во всем веб-сайте. Маршрутизация особенно удобна, когда требуется предоставить более понятные URL-адреса, чтобы поисковые механизмы могли полнее индексировать данный веб-сайт.
Отображение URL-адресов
В некоторых ситуациях необходимо иметь несколько URL, ведущих к одной и той же странице. Это может быть вызвано разными причинами - возможно, на одной странице требуется реализовать определенную логику и использовать аргументы строк запроса, предлагая при этом пользователям веб-сайта короткие и простые для запоминания URL-адреса (такие URL-адреса часто называют дружественными). Или же может понадобиться переименовать страницу, сохраняя при этом старый URL-адрес действующим, чтобы не нарушать закладки пользователей. Хотя веб-серверы иногда обеспечивают подобную функциональность, ASP.NET включает собственный механизм отображения URL-адресов.
Основная идея отображения URL-адресов ASP.NET состоит в сопоставлении одного URL-адреса запроса с другим URL-адресом. Правила отображения хранятся в файле web.config, и они применяются перед тем, как начинается какая-либо обработка. Естественно, чтобы среда ASP.NET применила отображение, она должна обрабатывать запрос; это означает, что URL-адрес запроса должен использовать такое расширение типа файла, которое отображается на ASP.NET.
Отображение URL-адресов определяется в разделе <urlMappings> файла web.config. Вы задаете два элемента информации: URL-адрес запроса (как атрибут url) и URL-адрес нового пункта назначения (mappedUrl). Например:
<configuration>
<system.web>
<urlMappings enabled="true">
<add url="~/Hardware.aspx" mappedUrl="~/Default.aspx?category=Hardware"/>
<add url="~/Software.aspx" mappedUrl="~/Default.aspx?category=Software"/>
</urlMappings>
</system.web>
</configuration>
Чтобы выполнилось сопоставление, входящий URL-адрес должен запрашивать ту же страницу. Однако регистр символов в URL-адресе запроса игнорируется, поскольку он является аргументом строки запроса. К сожалению, расширенные правила сопоставления, например, с применением групповых символов или регулярных выражений, не поддерживаются.
При использовании отображения URL-адреса переадресация производится точно таким же образом, как и с помощью метода Server.Transfer(). Это означает, что полный обмен с сервером производиться не будет, и URL-адрес в браузере будет по-прежнему показывать исходный URL-адрес запроса, а не отображенный URL-адрес. В коде свойства Request.Path и Request.QueryString отражают новый (отображенный) URL-адрес. Свойство Request.RawUrl возвращает исходный дружественный URL-адрес запроса.
Эта схема может привести к возникновению некоторых сложностей, если применять ее вместе с картами сайтов. Что будет использовать поставщик карты сайта при поиске текущего узла в карте сайта: исходный URL-адрес запроса или URL-адрес назначения? Применяться будут оба URL-адреса. Поставщик начинает с того, что пытается сопоставить URL-адрес запроса (предоставляемого в свойстве Request.RawUrl), и если ни одного значения не будет найдено, он будет использовать свойство Request.Path. Так ведет себя поставщик XmlSiteMapProvider, поэтому при необходимости данное поведение можно изменить в специальном поставщике.
Маршрутизация URL-адресов
Маршрутизация - это ключевое средство платформы ASP.NET MVC. ASP.NET позволяет использовать те же технологии маршрутизации в традиционных веб-приложениях, состоящих из веб-форм.
В отличие от отображения URL-адресов, URL-маршрутизация выполняется не в файле web.config. Вместо этого она реализуется с помощью кода. Как правило, регистрация всех маршрутов для данного приложения производится с использованием метода Application_Start() в файле global.asax.
Для регистрации маршрута служит класс RouteTable из пространства имен System.Web.Routing. Он предоставляет статическое свойство Routes, которое содержит коллекцию объектов Route, определенных для приложения. В начале эта коллекция пуста, но собственные специальные маршруты можно создавать, вызывая метод MapPageRoute(), который принимает три аргумента:
routeName
Этот аргумент представляет имя, которое уникальным образом идентифицирует маршрут. Имя может быть любым.
routeUrl
Этот аргумент указывает формат URL-адреса, который будет использоваться браузерами. Как правило, URL-адрес маршрута состоит из трех фрагментов переменной информации, разделенных символами косой черты, которые извлекаются и передаются коду. Например, станицу товара можно запросить, используя URL-адрес наподобие /products/4312.
physicalFile
Этот аргумент определяет целевую веб-форму - место, куда будут перенаправляться пользователи в случае применения данного маршрута. Информация из исходного аргумента routeUrl анализируется и становится доступной для данной страницы в виде коллекции посредством свойства Page.RouteData.
Ниже приведен пример добавления двух маршрутов в веб-приложение при его первом запуске:
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute("product-details",
"product/{productID}", "~/productInfo.aspx");
RouteTable.Routes.MapPageRoute("product-in-category",
"products/category/{categoryID}", "~/products.aspx");
}
URL-адрес маршрута может включать в себя два или более параметров, представляемых заполнителем в фигурных скобках. Например, первый из показанных в этом примере маршрутов содержит параметр productID. Этот элемент информации извлекается из URL-адреса и передается целевой странице.
А так выглядит URL-адрес, который использует этот маршрут для запроса товара с идентификатором AU_1044:
http://mysite.com/product/AU_1044
В результате инфраструктура маршрутизации ASP.NET перенаправляет пользователя на страницу productInfo.aspx. Все параметры предоставляются посредством свойства Page.RouteData. Формально свойство Page.RouteData предоставляет объект RouteData. Наиболее полезным свойством в нем является коллекция Values, которая предоставляет все параметры из исходного запроса, проиндексированные по имени.
Ниже приведен пример, демонстрирующий, как страница productInfo.aspx может извлечь идентификатор запрошенного товара из исходного URL-адреса:
protected void Page_Load(object sender, System.EventArgs e)
{
string productID = (string)Page.RouteData.Values["productID"];
// Выполнить какие-то операции, например, запрос к базе данных
}
Аналогично второй маршрут в этом примере принимает URL-адреса в следующей форме:
http://mysite.com/products/category/342
Хотя подобный URL-адрес можно жестко закодировать, вспомогательный метод Page.GetRouteUrl() делает это автоматически, избегая потенциальных ошибок. Ниже приведен пример поиска маршрута (с использованием его зарегистрированного имени), передачи информации о параметрах и извлечения соответствующего URL-адреса:
hyperLink.NavigateUrl =
Page.GetRouteUrl("product-details", new { productID = "AU_1044" });
Результатом является маршрутизированный URL-адрес, который указывает на товар AU_1044, как было показано в первом примере.