覆盖Sitecore的链接提供程序时CPU峰值

时间:2013-02-20 22:49:51

标签: sitecore

在覆盖Sitecore的链接提供商后,我们的CPU出现了高峰。我们正在重写GetItemUrl以获取某些类型模板的别名url,当访问该网站的唯一内容是keepalive页面时,它会占用CPU的80%。

这是默认链接提供程序的配置行,可以正常工作:

<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="never" languageLocation="filePath" shortenUrls="true" useDisplayName="false" />

这是我们的自定义链接提供程序的配置行,它会激活CPU:

<add name="sitecore"
type="Library.Pipelines.CustomLinkProvider, Library"
addAspxExtension="false"
alwaysIncludeServerUrl="false"
encodeNames="true"
languageEmbedding="never"
languageLocation="filePath"
shortenUrls="true"
useDisplayName="false" />

CustomLinkProvider类:

public class CustomLinkProvider : LinkProvider
{
    public override string GetItemUrl(Item item, UrlOptions options)
    {
        // check if item is factsheet or story, if it is then get the alias url
        if (item.TemplateID == ItemConstants.Pages.Factsheet.TemplateID 
        || item.TemplateID == ItemConstants.Pages.Story.TemplateID)
        {
            if (Sitecore.Context.Database != null)
            {
                if (SitecoreHelpers.HasAlias(item, Sitecore.Context.Database))
                {
                    Item alias = SitecoreHelpers.GetAlias(item, Sitecore.Context.Database);
                    string friendlyUrl = alias.Name;
                    return friendlyUrl;
                }
            }
        }
        return base.GetItemUrl(item, options);
    }
}

这是GetAlias功能:

public static Item GetAlias(Item currentItem, Database database)
{
    Item aliasFolder = database.GetItem(ItemConstants.Common.SystemAliasFolder);

    Item alias =
        aliasFolder.Children.FirstOrDefault(
        x => ((LinkField) x.Fields["Linked item"]).TargetID == currentItem.ID);

    return alias;
}

任何人都知道为什么会飙升CPU?目前大约有600个别名,但我不认为这会导致如此大的飙升。

1 个答案:

答案 0 :(得分:6)

我猜这是HasAlias和GetAlias的组合引起了你的问题。迭代600个sitecore项确实可能导致CPU峰值,特别是可能有多次调用链接提供程序。像ANTS这样的探查器可以让你确认。

我建议您不要在每次调用时执行此操作,而是阅读所有别名并缓存将项目与其别名相关联的数据结构。添加,编辑或删除别名时,您需要清除缓存,但这样可以节省大量的CPU周期。