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