Kentico: PortalTemplate.aspx явно выдает ошибку 404 при прямом вызове - PullRequest
0 голосов
/ 29 августа 2018

Мы работаем над продуктом, представляющим собой серию компонентов, которые могут быть установлены на разных CMS и которые предоставляют разные услуги. Мы применяем независимый от CMS подход и стараемся максимально использовать один и тот же код во всех CMS (мы стараемся избегать использования CMS API, насколько это возможно) .

Некоторая часть кода должна работать с текущим URL для некоторых перенаправлений, поэтому мы используем Request.Url.ToString(), что отлично работает в других средах, но в Кентико вместо возврата текущей страницы мы всегда получаем ссылку на CMSPages/PortalTemplate.aspx с параметром строки запроса aliasPath, который содержит реальный URL. Кроме того, запрос страницы шаблона с помощью браузера приводит к ошибке 404.

Пример:

Реальный URL (это отлично работает в браузере): (1) https://www.customer.com/Membership/Questionnaire?Id=7207f9f9-7354-df11-88d9-005056837252

Request.Url.ToString () (это дает вам ошибку 404 в браузере): (2) https://www.customer.com/CMSPages/PortalTemplate.aspx?Id=7207f9f9-7354-df11-88d9-005056837252&aliaspath=/Membership/Questionnaire

Я заметил, что ошибка 404 явно генерируется кодом шаблона при прямом вызове. Пожалуйста, смотрите ниже код из Page_Init метод PortalTemplate.aspx.cs :

var resolvedTemplatePage = URLHelper.ResolveUrl(URLHelper.PortalTemplatePage);
if (RequestContext.RawURL.StartsWithCSafe(resolvedTemplatePage, true))
{
    // Deny direct access to this page
    RequestHelper.Respond404();
}

base.OnInit(e);

Итак, если я прокомментирую приведенный выше код, мое перенаправление будет работать нормально ((2) разрешается в (1)). Я знаю, что это не изящное решение, но так как я не могу / не хочу использовать Kentico API, это единственный обходной путь, который я смог найти.

Обратите внимание, что я знаю, что использование Kentico API решит проблему, поскольку я уверен, что найду метод API, который вернет реальную страницу. Я стараюсь избегать этого как можно больше.

Вопросы: я что-то ломаю? Есть ли лучший способ достичь того, чего я пытаюсь достичь? Можете ли вы подумать по любой веской причине, что я не должен делать то, что я делаю (безопасность, удобство использования и т. Д.)?

Это довольно широкий вопрос, поэтому я не смог найти никакой полезной информации о документах Kentico.

Я тестирую все это на Kentico v8.2.50 , которая является версией, которую один из моих клиентов в настоящее время имеет.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

На самом деле не рекомендуется редактировать исходные файлы Kentico, так как вы можете столкнуться с проблемами при будущих обновлениях, а также столкнуться с неожиданным поведением.

Если вы хотите получить исходный URL-адрес, отправленный на сервер до того, как маршрутизация Kentico сделала свою работу, вы можете использовать Page.Request.RawUrl. Используя приведенный выше пример, RawUrl вернет значение /Membership/Questionnaire?Id=7207f9f9-7354-df11-88d9-005056837252, тогда как Url вернет Uri со значением https://www.customer.com/CMSPages/PortalTemplate.aspx?Id=7207f9f9-7354-df11-88d9-005056837252&aliaspath=/Membership/Questionnaire (как вы указали).

Это должно избежать необходимости использовать Kentico API, а также избегать необходимости изменять файл, который проходит почти каждый запрос при использовании механизма портала.

Если вам нужно получить полный URL для перенаправления, вы можете использовать что-то вроде этого:

var redirectUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.RawUrl;
...