1

覆盖 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 个别名,但我认为这不会导致如此大的峰值。

4

1 回答 1

6

我猜这是导致您的问题的 HasAlias 和 GetAlias 的组合。迭代 600 个站点核心项目确实会导致 CPU 峰值,尤其是在可能对链接提供程序进行多次调用的情况下。诸如 ANTS 之类的分析器将允许您确认。

我建议您不要在每次调用时都这样做,而是读取所有别名并缓存将您的项目与其别名相关联的数据结构。添加、编辑或删除别名时,您需要清除缓存,但这应该会为您节省大量 CPU 周期。

于 2013-02-20T23:58:45.347 回答