好的家伙和女孩们,这个真的很奇怪:当我为我的网络数据库重建Lucene索引时,我的Sitecore实例(6.4.1)正在悄悄地进行。查看日志文件,一切都很好,直到索引重建开始,然后日志填充了以下堆栈跟踪的MEGABYTES一遍又一遍地重复:
ManagedPoolThread #6 15:57:06 ERROR Failed to sort items
Exception: System.IO.FileNotFoundException
Message: Could not load file or assembly 'file:///[OTHER PROJECT LIBRARY].dll' or one of its dependencies. The system cannot find the file specified.
Source: mscorlib
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at Sitecore.Reflection.ReflectionUtil.LoadAssembly(String name)
at Sitecore.Reflection.ReflectionUtil.CreateObject(String assembly, String className, Object[] parameters)
at Sitecore.Reflection.ReflectionUtil.CreateObject(String typeName, Object[] parameters)
at Sitecore.Data.Comparers.ComparerFactory.GetComparer(String sortingId, Database database)
at Sitecore.Data.Comparers.ComparerFactory.GetComparer(Item item)
at Sitecore.Configuration.Factory.GetItemComparer(Item item)
at Sitecore.Data.Managers.ItemProvider.Sort(ItemList items, Item owner)
([OTHER PROJECT LIBRARY] .dll缩短了隐私权,但这是该项目的sitecore / website / bin目录的完整路径)
真正非常奇怪的是,在解决方案或整个文件树(项目和网站文件夹)中都没有以任何方式,形状或形式引用此DLL。
但是这里有一个妙语:这个DLL甚至不是来自同一个项目,而是来自我工作站上的一个不同的项目(它在自己的Sitecore实例中与该项目一起运行)。
怎么会发生这种情况?项目A正在尝试从项目B引用DLL,并且不以任何方式引用此DLL。我甚至检查过我的数据库中的EventQueue表...我真的开始在这里迷失方向。
答案 0 :(得分:4)
查看附加的堆栈跟踪,您可以看到问题是Sitecore在排序某些项目时尝试找到合适的比较器。看起来您的某个项目的“Type”字段已设置为某个外部库中的类名。也许有人从剪贴板上粘贴了一些错误的类名并没有注意到它?
尝试执行此查询以查找具有错误字段值集的项目的名称和ID以及字段值:
SELECT
ii.Name, ii.ID, f.Value
FROM
[Sitecore_Master].[dbo].[SharedFields] f,
[Sitecore_Master].[dbo].[Items] i,
[Sitecore_Web].[dbo].[Items] ii
WHERE f.FieldId = i.ID
AND i.Name = 'Type'
AND ii.ID = f.ItemId
AND f.Value LIKE '%[OTHER ASSSEMBLY NAME WITHOUT DLL].%'
将数据库的名称更改为您的数据库,并使用日志中显示的程序集的名称。您也可以在没有 AND i.Name ='Type'行的情况下尝试与其他数据库进行此查询。
另一种方法是覆盖 ItemProvider 类,如下所示:
namespace My.Namespace
{
public class MyItemProvider : Sitecore.Data.Managers.ItemProvider
{
protected override void Sort(Sitecore.Collections.ItemList items, Sitecore.Data.Items.Item owner)
{
try
{
base.Sort(items, owner);
}
catch (System.Exception exc)
{
Sitecore.Diagnostics.Log.Error("Exception while sorting children of " + owner.Paths.FullPath, exc, this);
}
}
}
}
并更改 sitecore.config 文件:
<itemManager defaultProvider="default">
<providers>
<clear/>
<add name="default" type="My.Namespace.MyItemProvider, My.Assembly"/>
</providers>
</itemManager>
您现在应该在日志中看到哪个项目导致了问题。
答案 1 :(得分:0)
查看配置文件,看看是否可以找到对这个神秘DLL的引用。
提示:浏览到/sitecore/admin/showconfig.aspx以查看主web.config中的完整配置设置以及所有include配置文件。 我的预感是有一些自定义处理程序引用在索引重建后触发的DLL