Как я могу обнаружить запрос ребенка? - PullRequest
1 голос
/ 12 октября 2010

Я пытаюсь создать HttpModule в C #, который будет перенаправлять произвольные URL-адреса и отсутствующие файлы и который будет выполнять канонизацию всех входящих URL-адресов. Часть моего процесса канонизации заключается в перенаправлении из документов по умолчанию (таких как http://www.contoso.com/default.aspx) в пустой каталог (например, http://www.contoso.com/)

. Я обнаружил, что когда IIS-сервер получает запрос на пустой каталог, он обычно обрабатывает этот запрос, а затем создает дочерний запрос длявыбранный документ по умолчанию. Это создает цикл перенаправления в моем модуле - первый запрос проходит нормально, но когда он видит дочерний запрос, он удаляет документ по умолчанию из URL и перенаправляет обратно в пустой каталог, снова запуская процесс.

Очевидно, что все, что мне нужно для решения этой проблемы, - это чтобы мой модуль знал, когда он видит дочерний запрос, чтобы он мог его игнорировать. Но я не могу найти в Интернете ничего, описывающего, как разделить эти два запроса отдельно.Я обнаружил, что заголовки запроса намежду этими двумя запросами, поэтому я попытался добавить значение в заголовки запроса и затем искать это значение.Это работало в IIS 7, но, очевидно, IIS 6 не позволит вам изменять заголовки запросов, и мой код должен выполняться в обоих случаях.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2015

Эти дочерние запросы также могут быть вызваны любым Server.Transfer или Server.Executes в коде.Одна хитрость, которая работает для обнаружения дочернего запроса, заключается в добавлении настраиваемого заголовка запроса во время первого запроса и проверке его позже (в случае дочернего запроса).Пример:

private bool IsChildRequest(HttpRequest request)
{
  var childRequestHeader = request.Headers["x-parent-breadcrumb"];
  if (childRequestHeader != null) 
  {
    return true;
  }

  request.Headers["x-parent-breadcrumb"] = "1"; // arbitrary value
  return false;
}

Это работает, потому что заголовки запроса передаются дочернему запросу.Сначала я попытался сделать это с помощью HttpContext.Current.Items, но, похоже, он был сброшен для дочернего запроса.

0 голосов
/ 13 октября 2010

То, что происходит с вашим модулем, совершенно так, как должно.Если вашей страницей по умолчанию является Default.aspx, то IIS обязан перенаправить на Default.aspx, что заставит ваш модуль повторить работу.Однако я не понимаю, почему вы хотите, чтобы http://www.contoso.com/default.aspx был перенаправлен на http://www.contoso.com?, возможно, вам нужно переопределить ваше требование.Или, если возможно, у вас может быть другая страница по умолчанию (например, http://www.contoso.com/Home.aspx), и тогда ваш IIS должен пересылать пустые запросы на этот URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...