Маршрутизация URL

72

В основу модели карты сайта положен простой принцип: каждая запись имеет отдельный 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(), который принимает три аргумента:

Ниже приведен пример добавления двух маршрутов в веб-приложение при его первом запуске:

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, как было показано в первом примере.

Пройди тесты
Лучший чат для C# программистов