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