Sitecore LinkManager GetItemUrl.为什么这么棘手?

Vol*_*hat 3 c# sitecore sitecore6

我的任务是在网站上更改smth时获取内容的网址.它就像CRUD操作日志记录(在我的情况下,我正在将该URL记录到其他系统进行进一步处理).它应该适用于版本6及更高版本.

当我开始它似乎很简单订阅事件然后采取项目并生成它的URL.我订阅了两个事件发布:itemProcessing(因为此处只有项目尚未从Web数据库中删除),发布:itemProcessed(用于添加和更新).

这个事件给了我时间对象Item,所以看起来像这样的url非常简单

var options = LinkManager.GetDefaultUrlOptions();
options.AlwaysIncludeServerUrl = true;
options.SiteResolving = true;
var url = LinkManager.GetItemUrl(item, options);
Run Code Online (Sandbox Code Playgroud)

在这里我的问题开始了.首先,我需要有正确的网址,并以同样的方式,因为它是在网站上产生的,但这里的URL返回我像水木清华" HTTP://domain/sitecore/content/Home.aspx ".

所以我添加了新的方法来从网站定义中找到正确的网站

private List<KeyValuePair<string, SiteContext>> GetSites()
{
            return SiteManager.GetSites()
                .Where(
                    s =>
                        !string.IsNullOrEmpty(s.Properties["rootPath"]) &&
                        !string.IsNullOrEmpty(s.Properties["startItem"]))
                .Select(
                    d => new KeyValuePair<string, SiteContext>($"{d.Properties["rootPath"]}{d.Properties["startItem"]}",
                        new SiteContext(new SiteInfo(d.Properties))))
                .ToList();
}

public virtual SiteContext GetSiteContext(Item item)
{

            var site = _sites.LastOrDefault(s => item.Paths.FullPath.ToLower().StartsWith(s.Key.ToLower()));
            return site.Value;
}

options.Site = GetSiteContext(Item item);
Run Code Online (Sandbox Code Playgroud)

再次问题没有解决,因为sitecore返回" http://127.0.0.1/en.aspx "

然后我继续阅读并理解网站定义应该有targetHostName(它实际上是有意义的,因为一个网站可以有多个域)但是当我现在添加targetHostName时它会返回其他链接" ://targetHostName/en.aspx "所以http | https不见了.第二个问题是,它返回我EN.aspx这意味着这个页面可以访问扔HTTP://targetHostName/en.aspxHTTP:// targetHostName

现在我有以下网站定义

 <sites>
      <site name="shell" virtualFolder="/sitecore/shell" physicalFolder="/sitecore/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" loginPage="/sitecore/login" content="master" contentStartItem="/Home" enableWorkflow="true" enableAnalytics="false" analyticsDefinitions="content" xmlControlPage="/sitecore/shell/default.aspx" browserTitle="Sitecore" htmlCacheSize="2MB" registryCacheSize="3MB" viewStateCacheSize="200KB" xslCacheSize="5MB" />
      <site name="login" virtualFolder="/sitecore/login" physicalFolder="/sitecore/login" enableAnalytics="false" database="core" domain="sitecore" disableXmlControls="true" />
      <site name="admin" virtualFolder="/sitecore/admin" physicalFolder="/sitecore/admin" enableAnalytics="false" enableWorkflow="true" domain="sitecore" loginPage="/sitecore/admin/login.aspx" />
      <site name="service" virtualFolder="/sitecore/service" physicalFolder="/sitecore/service" />
      <site name="modules_shell" virtualFolder="/sitecore modules/shell" physicalFolder="/sitecore modules/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" content="master" enableAnalytics="false" enableWorkflow="true" />
      <site name="modules_website" virtualFolder="/sitecore modules/web" physicalFolder="/sitecore modules/web" rootPath="/sitecore/content" startItem="/home" language="en" database="web" domain="extranet" allowDebug="true" cacheHtml="true" />
      <site name="website" hostName="sitecore6.target|sitecore6.local" targetHostName="sitecore6.target" schema="http" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
      <site name="scheduler" enableAnalytics="false" domain="sitecore" />
      <site name="system" enableAnalytics="false" domain="sitecore" />
      <site name="publisher" domain="sitecore" enableAnalytics="false" enableWorkflow="true" />
    </sites>
Run Code Online (Sandbox Code Playgroud)

和链接管理器设置

 <linkManager defaultProvider="sitecore">
      <providers>
        <clear />
        <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="true" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="asNeeded" languageLocation="filePath" lowercaseUrls="false" shortenUrls="true" useDisplayName="false" />
      </providers>
    </linkManager>
Run Code Online (Sandbox Code Playgroud)

Ric*_*eal 11

出现问题的原因是您生成链接的位置.当您将AlwaysIncludeServerUrl选项设置为true时,Sitecore将使用当前Sitecore.Context.Site信息来计算服务器Url.

要设置http或https部分,您需要添加一个名为scheme您的网站定义的属性- 我认为您只有一个错字,因为您有一个名为schema:

<sites>
    <site name="website" hostName="sitecore6.target|sitecore6.local" targetHostName="sitecore6.target" scheme="http" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
</sites>
Run Code Online (Sandbox Code Playgroud)

在发布活动期间,这Context.Site将是shell网站.所以它不会targetHostName为你的website定义提取.

要强迫它,你需要使用 SiteContextSwitcher

var website = Sitecore.Configuration.Factory.GetSite("website");
using (new SiteContextSwitcher(website))
{
    var options = LinkManager.GetDefaultUrlOptions();
    options.AlwaysIncludeServerUrl = true;
    options.SiteResolving = true;
    var url = LinkManager.GetItemUrl(item, options);
}
Run Code Online (Sandbox Code Playgroud)

然后将使用网站生成Url,targetHostName并且应该生成您期望的方式.

最后一个注意事项 - 最佳做法是通过包含文件修补新的网站定义,而不是编辑主Sitecore配置.看看你的include文件夹,那里应该有一个SiteDefinition.config.example文件.它告诉你如何做到这一点.

  • 我会接受这个答案,因为设置网站是一种更优雅的方式.我切换到sitecore 8,现在它工作,所以可能在版本6中有bug (2认同)