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