Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kentico:PortalTemplate.aspx在直接调用时显式抛出404错误_Kentico - Fatal编程技术网

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

Kentico:PortalTemplate.aspx在直接调用时显式抛出404错误,kentico,Kentico,我们开发的产品是一系列可以安装在不同CMS上并提供不同服务的组件我们采取与CMS无关的方法,尽量在所有CMS中使用相同的代码(我们尽量避免使用CMS API) 代码的某些部分需要使用当前URL进行某些重定向,因此我们使用Request.URL.ToString()这在其他环境中运行良好,但在Kentico中,我们总是得到一个对CMSPages/PortalTemplate.aspx的引用,其中包含一个包含真实URL的querystring参数aliasPath。除此之外,使用浏览器请求模板页面会

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

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

例如:

真实URL(在浏览器上可以正常工作): (一)

Request.Url.ToString()(这会在浏览器上显示404错误): (二)

我注意到404错误在直接调用时由模板代码显式抛出。请参见以下代码,该代码来自于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

注意,我知道使用KenticoAPI可以解决这个问题,因为我确信我会找到一个返回实际页面的API方法。我正在尽可能地避免这种情况

问题:我打碎了什么东西吗?有没有更好的方法来实现我想要实现的目标?你能想出什么好的理由我不应该做我正在做的事情(安全性、可用性等)

这是一个非常广泛的问题,所以我无法找到任何关于Kentico docs的有用信息

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


提前感谢。

不建议编辑Kentico的源文件,因为您可能会在将来的升级中遇到问题,并且会看到一些意外行为

如果要在Kentico的路由完成工作之前将原始URL发送到服务器,可以使用
Page.Request.RawUrl
。使用上述示例,
RawUrl
将返回值
/Membership/inventory?Id=7207f9f9-7354-df11-88d9-005056837252
,而
Url
将返回值为
https://www.customer.com/CMSPages/PortalTemplate.aspx?Id=7207f9f9-7354-df11-88d9-005056837252&aliaspath=/Membership/问卷
(如您所述)

这应该可以避免使用Kentico API,也可以避免在使用门户引擎时更改几乎每个请求都要经过的文件

如果需要获取重定向到的完整URL,可以使用以下方法:

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

Hi Martin,你能确认几件事吗:你的代码样本是来自
PortalTemplate.aspx.cs
,你使用的是什么版本的Kentico?谢谢@mnield,RawUrl的问题是它在其他CMS上不起作用,比如DotNetNuke,由于PortalTemplate限制似乎有点随意,我想绕过它,但你是对的,在这种情况下,也许我需要添加一些基于CMS的逻辑。一个简单的检查可能是看看
Request.Url.Segments[1].StartsWith(“PortalTemplate.aspx”,StringComparison.InvariantCultureIgnoreCase)
是如何工作的,或者找到另一种方法来检测Kentico,而无需旋转API。例如,在应用程序启动时检测是否存在
CMS.Core
,然后将其存储在应用程序级别。这样,如果你在其他地方需要它,你已经有了它。是的,我可能会这样做。谢谢你在这方面的帮助。