Как реализовать перезапись URL с помощью Windows Azure? - PullRequest
9 голосов
/ 18 июня 2011

У меня есть веб-сайт ASP.NET / C #, который размещен на Windows Azure. Сайт представляет собой социальный сайт, основанный на прогнозах, с главной страницей прогнозов. Если щелкнуть сводку, вы будете перенаправлены на страницу сведений для этого прогноза с помощью простой строки QueryString.

Например:

http://www.ipredikt.com/details.aspx?id=14

Этот конкретный прогноз называется "Пэрис Хилтон получит Нобелевскую премию мира" , поэтому я хотел бы осуществить перезапись URL для моего сайта в Azure следующим образом:

http://www.ipredikt.com/predictions/14/paris-hilton-will-win-the-nobel-peace-prize

Каковы некоторые стратегии и лучшие практики для этого? И может, кто-нибудь укажет мне хорошую статью, посвященную Azure, или две.

Название дефиса («paris-hilton-bla-bla») действительно просто для того, чтобы сделать URL более читабельным; Я не предполагаю полагаться на это вообще с точки зрения загрузки страниц. На самом деле, я бы, возможно, разрешил повторяющиеся заголовки, поскольку буду полагаться на идентификатор прогноза в URL.

EDIT:

Забыл упомянуть, что мы НЕ на основе MVC. Мы пришли с нашей собственной архитектурой, которая использует PageMethods и WebMethods, чтобы вернуть JSON клиенту. Мы используем ASP.NET AJAX для выполнения всей сериализации JSON, и почти весь наш пользовательский интерфейс динамически создается на клиенте с использованием jQuery.

РЕДАКТИРОВАТЬ: РЕШЕНИЕ

Думал, что поделюсь своим решением сейчас, когда у меня все работает и работает.

Я создал новый класс следующим образом (дословно скопировал):

public class WebFormRouteHandler<T> : IRouteHandler where T : IHttpHandler, new()
{
   public string VirtualPath { get; set; }

   public WebFormRouteHandler(string virtualPath)
   {
      this.VirtualPath = virtualPath;
   }

   public IHttpHandler GetHttpHandler(RequestContext requestContext)
   {
      return (VirtualPath != null)
          ? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
          : new T();
   }
}

Я добавил следующий метод в Global.asax. Фактический метод гораздо, гораздо дольше (он охватывает каждую страницу на сайте). Вы увидите, что я поддерживаю вызов страницы прогнозов разными способами: с идентификатором, с идентификатором + заголовок и т. Д. (Версии страниц "... fb" предназначены для версии приложения Facebook на моем сайте, которая используйте другую мастер-страницу.)

  public static void RegisterRoutes(RouteCollection routes)
  {
     // Details : 'predictions' Page
     var routeHandlerDetails = new WebFormRouteHandler<Page>("~/details.aspx");
     var routeHandlerDetailsFb = new WebFormRouteHandler<Page>("~/detailsfb.aspx");

     routes.Add(new Route("predictions/{id}", routeHandlerDetails));
     routes.Add(new Route("predictions/{id}/{title}", routeHandlerDetails));

     routes.Add(new Route("fb/predictions/{id}", routeHandlerDetailsFb));
     routes.Add(new Route("fb/predictions/{id}/{title}", routeHandlerDetailsFb));
   }

... и этот метод вызывается из Application_Start ()

  void Application_Start(object sender, EventArgs e)
  {
     RegisterRoutes(RouteTable.Routes);
  }

Затем я добавил следующее в web.config в блоке system.webServer:

   <!-- Added for URL Routing -->
   <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
           type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
   </modules>

    <!-- Added for URL Routing -->
    <handlers>
      <add name="UrlRoutingHandler"
           preCondition="integratedMode"
           verb="*"
           path="UrlRouting.axd"
           type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   </handlers>

Мне также пришлось исключить виртуальный каталог «предсказания» из проверки подлинности (поскольку почти все части нашего сайта доступны для моих неавторизованных пользователей):

<!-- Url routing -->
<location path="predictions">
   <system.web>
      <authorization>
         <allow users="*" />
      </authorization>
   </system.web>
</location>

Наконец, я больше не полагаюсь на строковые параметры QueryString при загрузке страниц, поэтому мне пришлось написать несколько новых вспомогательных методов. Вот тот, который извлекает числовое значение из нового URL-адреса маршрутизации (я буду очищать его, чтобы получить только один возврат).

  public static int GetRouteDataValueAsNumber(HttpRequest request, string propertyName)
  {
     if ((request == null) ||
         (request.RequestContext == null) ||
         (request.RequestContext.RouteData == null) ||
         (request.RequestContext.RouteData.Values[propertyName] == null))
     {
        return -1;
     }

     try
     {
        return System.Convert.ToInt32(request.RequestContext.RouteData.Values[propertyName]);
     }
     catch
     {
     }

     return -1;
  }

Теперь, когда мне нужно прочитать значение маршрутизации (например, идентификатор прогноза), я делаю следующее:

  long _predictionId = System.Convert.ToInt64(WebAppUtils.GetRouteDataValueAsNumber(Request, "id"));

Отлично работает! Теперь мой сайт выглядит как приложение MVC с дружественными и самодокументирующимися URL.

О, наконец, вам также нужно включить перенаправление HTTP следующим образом:

Пуск => Панель управления => Программа => Включение функций Windows => Информационные службы Интернета => Службы всемирной паутины => Общие функции HTTP => (установите флажок для) Перенаправление HTTP.

Ответы [ 2 ]

12 голосов
/ 18 июня 2011

Самый простой способ реализовать это - программный подход с использованием сборки System.Web.Routing.

Это в основном работает путем включения UrlRoutingModule в ваш web.config и определения шаблонов, которые разрешают целевую страницу на основе соответствующих маршрутов.Если вы знакомы с ASP.NET MVC, то ранее вы использовали эту стратегию маршрутизации, но для использования маршрутизации в MVC нет необходимости.

Вот несколько ресурсов, которые помогут вам начать работу:

О Windows Azure ...

Если вы воспользуетесь этим подходом,на самом деле не имеет значения, что вы используете Windows Azure.Однако я нашел статью Майкла Кеннеди под названием Маршрутизация ASP.NET в Windows Azure с использованием веб-форм , в которой объясняется, как легко развернуть такое решение в Windows Azure.В статье даже есть пример проекта для скачивания .

3 голосов
/ 19 июня 2011

В веб-ролях Azure установлен модуль перезаписи URL-адреса IIS7 - http://msdn.microsoft.com/en-us/library/dd573358.aspx

«Как» для этого модуля на http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

Для вашего примера с Парижем вам нужно установить правило, которое отображает URL

http://www.ipredikt.com/predictions/14/paris-hilton-will-win-the-nobel-peace-prize

до

http://www.ipredikt.com/details.aspx?id=14

Это что-то вроде:

Узор -

^predictions/([0-9]+)/([_0-9a-z-]+)

Действие -

 details.aspx?id={R:1}

Подробнее об определении этих правил см. http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/

...