C# Sitecore:如何拒绝访问站点根项目之外的项目

C# Sitecore:如何拒绝访问站点根项目之外的项目,c#,sitecore,C#,Sitecore,我试图将内容树中的项目隐藏在我的站点根项目之外,以便URL无法访问这些项目 我的两种方法不起作用: 第一个是使用Web.config中的设置 这可以解决问题,但LinkManager开始引发异常。由于startItem为空,它试图从空字符串生成子字符串,因此崩溃 第二次尝试是实现一个ItemNotFound处理器,这样,如果我的项不是SiteRoot或它的后代,它会将上下文项设置为null并生成404例程 public class ItemNotFoundHandler : HttpRequ

我试图将内容树中的项目隐藏在我的站点根项目之外,以便URL无法访问这些项目

我的两种方法不起作用:

第一个是使用Web.config中的设置


这可以解决问题,但LinkManager开始引发异常。由于startItem为空,它试图从空字符串生成子字符串,因此崩溃

第二次尝试是实现一个ItemNotFound处理器,这样,如果我的项不是SiteRoot或它的后代,它会将上下文项设置为null并生成404例程

public class ItemNotFoundHandler : HttpRequestProcessor
{
    public override void Process(HttpRequestArgs args)
    {
        if (Sitecore.Context.Item != null && Sitecore.Context.Site.Name == "website")
        {
            Item siteroot = Sitecore.Context.Database.GetItem(Settings.SiteRootID);

            if (Sitecore.Context.Item.ID != siteroot.ID && !Sitecore.Context.Item.Axes.IsDescendantOf(siteroot))

                //Do404();
                Sitecore.Context.Item = null;
        }

        if (Sitecore.Context.Item != null  || Sitecore.Context.Site == null || Sitecore.Context.Database == null)
            return;



        Do404();
    }

    private void Do404()
    {
        Item item404 = Sitecore.Context.Database.GetItem(Settings.Error404ID);
        Sitecore.Context.Item = item404;
    }
}
这没有改变任何东西:上下文项保持不变。我不明白为什么


您能帮我吗?

如果您不想浏览到
主页
节点之外的项目,您可以做的是让这些项目没有任何演示详细信息

然后,您可以将设置
LayoutNotFoundUrl
更改为404页面:

<setting name="LayoutNotFoundUrl" value="/My404" />

我终于明白了。我反编译了Sitecore链接提供程序,发现了问题所在

第一种方法是正确的,只有一句话:startItem应该是空的

在计算rootPath时,考虑了“/”符号,它的长度变得太大,并且抛出了OutofRangeException。如果我删除了这个符号或者删除了startItem,就没有问题了



httprequest管道中的哪个位置连接此处理器?就在ItemResolver
Sitecore.Context.Item.Axes.IsDescendatof()之后-这将是一个性能问题。使用
Sitecore.Context.Item.path.FullPath.StartsWith(Sitecore.Context.Site.StartPath)
代替整个部分。剩下的看起来应该有用。如果添加断点,它们是否被命中?是的,断点被命中,Do404()被执行,但我仍然将该项呈现为好像什么都没有发生一样
private void Do404()
{
    Item item404 = Sitecore.Context.Database.GetItem(Settings.Error404ID);
    Sitecore.Web.WebUtil.Redirect(LinkManager.GetItemUrl(item404));
}