在覆盖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个别名,但我不认为这会导致如此大的飙升。
答案 0 :(得分:6)
我猜这是HasAlias和GetAlias的组合引起了你的问题。迭代600个sitecore项确实可能导致CPU峰值,特别是可能有多次调用链接提供程序。像ANTS这样的探查器可以让你确认。
我建议您不要在每次调用时执行此操作,而是阅读所有别名并缓存将项目与其别名相关联的数据结构。添加,编辑或删除别名时,您需要清除缓存,但这样可以节省大量的CPU周期。