Как реализовать перезапись URL-адресов в Windows Azure?

У меня есть веб-сайт 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.

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

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

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

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

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

public class WebFormRouteHandler : 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, которая используйте другой MasterPage.)

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

   
   
      
   

    
    
      
   

Мне также пришлось исключить виртуальный Каталог "predictions" из аутентификации (потому что почти все части нашего сайта доступны моим пользователям без авторизации):



   
      
         
      
   

Наконец, я больше не полагаюсь на строковые параметры 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 Вкл. => Internet Information Services => World Wide Web Services => Common HTTP Features => (установите флажок для) HTTP Redirection.

9
задан Armchair Bronco 21 June 2011 в 00:38
поделиться