Kentico:PortalTemplate.aspx 直接调用时显式抛出 404 错误

Kentico: PortalTemplate.aspx explicitly throwing a 404 error when directly invoked

我们开发的产品是一系列组件,可以安装在不同的 CMS 上并提供不同的服务。 我们采用与 CMS 无关的方法,并尝试尽可能在所有 CMS 中使用相同的代码(我们尽量避免使用 CMS API)

代码的某些部分需要使用当前的 URL 进行某些重定向,因此我们使用 Request.Url.ToString() 这在其他环境中运行良好但在 Kentico 中而不是 return 在当前页面中,我们总是得到一个对 CMSPages/PortalTemplate.aspx 的引用,其中包含一个包含真实 URL 的查询字符串参数 aliasPath。除此之外,使用浏览器请求模板页面会出现 404 错误。

示例:

Real URL (this works fine on a browser): (1) https://www.customer.com/Membership/Questionnaire?Id=7207f9f9-7354-df11-88d9-005056837252

Request.Url.ToString() (this gives you a 404 error on a browser): (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 方法来 return 实际页面。我尽量避免这种情况。

问题:我是不是弄坏了什么东西?有没有更好的方法来实现我想要完成的目标?你能想到我不应该做我正在做的事情的任何充分理由吗(安全性、可用性等)?

这是一个非常广泛的问题,所以我无法在 Kentico 文档上找到任何有用的信息。

我正在 Kentico v8.2.50 上测试所有这些,这是我的一位客户目前使用的版本。

提前致谢。

不建议编辑 Kentico 的源文件,因为您可能会开始 运行 遇到未来升级的问题,并且还会开始看到一些意外行为。

如果你想在之前将原始URL发送到服务器 Kentico的路由完成它的工作,你可以使用Page.Request.RawUrl。使用上面的示例,RawUrl 将 return 值为 /Membership/Questionnaire?Id=7207f9f9-7354-df11-88d9-005056837252,而 Url 将 return 值为 https://www.customer.com/CMSPages/PortalTemplate.aspx?Id=7207f9f9-7354-df11-88d9-005056837252&aliaspath=/Membership/Questionnaire 的 Uri(如你说的)。

这应该避免需要使用 Kentico API 并且还避免必须更改几乎每个请求在使用门户引擎时都要经过的文件。

如果您需要获得完整的 URL 重定向到,您可以使用这样的东西:

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