C# Sitecore链接管理器GetItemUrl。为什么这么棘手?

C# Sitecore链接管理器GetItemUrl。为什么这么棘手?,c#,sitecore,sitecore6,C#,Sitecore,Sitecore6,当网站上的smth发生变化时,我的任务是获取内容的url。它类似于CRUD操作日志记录(在我的例子中,我将URL记录到其他系统以进行进一步处理)。它应该在版本6和更高版本上工作 当我开始时,订阅事件然后获取项目并为其生成url似乎非常简单。我订阅了两个事件publish:itemProcessing(因为只有这里的项目尚未从web数据库中删除),publish:itemProcessing(用于添加和更新) 这个事件为我提供了时间项的对象,所以看起来url非常简单 var options = L

当网站上的smth发生变化时,我的任务是获取内容的url。它类似于CRUD操作日志记录(在我的例子中,我将URL记录到其他系统以进行进一步处理)。它应该在版本6和更高版本上工作

当我开始时,订阅事件然后获取项目并为其生成url似乎非常简单。我订阅了两个事件publish:itemProcessing(因为只有这里的项目尚未从web数据库中删除),publish:itemProcessing(用于添加和更新)

这个事件为我提供了时间项的对象,所以看起来url非常简单

var options = LinkManager.GetDefaultUrlOptions();
options.AlwaysIncludeServerUrl = true;
options.SiteResolving = true;
var url = LinkManager.GetItemUrl(item, options);
我的问题开始了。首先,我需要有正确的url和它在网站上生成的相同方式,但在这里url返回我类似于“”的smth

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

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);
 <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>
private List GetSites()
{
返回SiteManager.GetSites()
.在哪里(
s=>
!string.IsNullOrEmpty(s.Properties[“rootPath”])&&
!string.IsNullOrEmpty(s.Properties[“startItem”])
.选择(
d=>newkeyValuePair($“{d.Properties[“rootPath”]}{d.Properties[“startItem”]}”,
新站点上下文(新站点信息(d.Properties)))
.ToList();
}
公共虚拟站点上下文GetSiteContext(项)
{
var site=\u sites.LastOrDefault(s=>item.path.FullPath.ToLower().StartsWith(s.Key.ToLower());
返回站点。值;
}
options.Site=GetSiteContext(项);
由于sitecore返回“”,问题再次未得到解决

然后我继续阅读并理解站点定义应该有targetHostName(这实际上是有意义的,因为一个站点可以有多个域),但当我现在添加targetHostName时,它会返回另一个链接“://targetHostName/en.aspx”,因此缺少http | https。第二个问题是,它返回me EN.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);
 <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>

和链接管理器设置

 <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>

由于生成链接的位置,因此出现问题。当您将
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>
然后,将使用网站的
targetHostName
生成Url,并应生成您期望的方式


最后一点需要注意的是,最佳做法是通过include文件修补新的站点定义,而不是编辑主Sitecore配置。检查一下你的include文件夹,里面应该有一个
sitefinition.config.example
文件。它会告诉你怎么做。

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