Как Routing for WebForms может отображать строку запроса Google Adwords?

Я был на этом почти 2 дня, и я действительно чувствую себя застрявшим. Я уже несколько лет управляю сайтом, использующим MapPageRoute для создания URL-адресов для нескольких сотен «страниц», которые все обрабатываются «~ / default.aspx» через поиск данных страниц в базе данных. Весь сайт не такой (то есть это не одностраничный сайт), но большая его часть такова.

Он работает нормально, за исключением того, что я не могу использовать строки запроса на сопоставленных маршрутах. Метод RegisterRoutes в global.asax:

   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.Clear();
      routes.Ignore("{resource}.ashx/{*pathInfo}"); //ignore ashx files
      routes.Ignore("{resource}.axd/{*pathInfo}"); //ignore axd files, prevents javascript/routing collisions
      routes.MapPageRoute("SitePage", "{*page_url}", "~/default.aspx", false);
   }

Я использую подстановочный знак в сегменте пути. К сожалению, разрешен только один подстановочный знак. {* page_url} обычно представляет от 1 до 4 сегментов. Я пробовал различные формы кода IRouteHandler и IHttpHandler, но я не вижу, как изменить URL-адрес, отображаемый в клиентском браузере. Я могу использовать подстановочный знак таким образом, потому что ни один из маршрутов не мешает физическим файлам.

Единственная причина, по которой я хочу сохранить строку запроса, состоит в том, что Google Adwords добавляет строку? Gclid = xxxxxxxxx к рекламной ссылке, а Google Analytics .js использует эту строку запроса для отчета.

Пример URL-адреса проблемы:

/about-us/community/philanthropy  (resolves fine)

/about-us/community/philanthropy?gclid=xxxxxxx  (redirects back to:)
/about-us/community/philanthropy

В моем web.config нет настроек перезаписи URL, которые могут на это повлиять.

Изрядное количество моих исследований SO и других источников относится к сайтам MVC. Это сайт WebForms.

Пример, аналогичный вопрос, но для MVC: Как перенаправить URL-адрес со строкой запроса в ASP.NET MVC?


person secretwep    schedule 13.04.2016    source источник


Ответы (1)


Я полностью отказался от механизма маршрутизации и перешел к переписыванию пути. Моя выкройка не подходила точно для фрезерования.

Мне помог Крис Чжао. Возможно ли, чтобы служба маршрутизации поддерживала querystring в адресной строке браузера?

И эта ссылка была действительно полезна для более глубокого контекста: Перезапись URL в приложении ASP.NET

В global.asax в Application_BeginRequest:

if (Request.CurrentExecutionFilePathExtension == "" && Request.CurrentExecutionFilePath != "/"
     && g.Global.SITEPAGEROOTS.ContainsKey(Request.Url.Segments[1].Replace("/", "")))
{
   Context.RewritePath("/default.aspx", false);
}

G.Global.SITEPAGEROOTS - это синглтон словаря с ‹30 записями, который просто зависает в памяти до тех пор, пока не будет произведена сборка мусора. Он содержит базовый путь, сегмент первичного URL-адреса для моих страниц сайта, которые необходимо переписать. Кроме того, «false» отключает rebaseClientPath, который помогал с изображениями и другими элементами, которые не отображались на страницах из-за использования ссылок на корневые каталоги приложений (~ /).

На странице /default.aspx:

var rawUri = new Uri(Request.Url, Request.RawUrl);
//using RawUrl because the url is usually rewritten before hitting this page
//and RawUrl preserves the original url.

if (rawUri.LocalPath != "/" && rawUri.LocalPath != "/default.aspx")
{
    //lookup the rawUri.LocalPath in the db and pull out all the site page
    //data needed to render the page (html, metas, etc.)
    //querystring found at rawUri.Query if needed.
}
person secretwep    schedule 15.04.2016