0

皆さん、これは本当に奇妙です。Web データベースの 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 が、ソリューションまたはファイル ツリー全体 (プロジェクト フォルダーと Web サイト フォルダーの両方) の両方で、どのような方法、形状、または形式でも参照されていないことです。

しかし、ここにオチがあります: この DLL は同じプロジェクトからのものではなく、私のワークステーションにある別のプロジェクトからのものです (このプロジェクトと一緒に独自の Sitecore インスタンスで実行されています)。

これはどのように起こりますか?プロジェクト A はプロジェクト B から DLL を参照しようとしていますが、この DLL はまったく参照されていません。データベースの EventQueue テーブルもチェックしました...ここで本当に頭がおかしくなり始めています。

4

2 に答える 2

4

添付されたスタック トレースを見ると、Sitecore がいくつかの項目を並べ替えるときに適切な比較子を見つけようとすることが問題であることがわかります。アイテムの 1 つに、「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'行を使用せずに、他のデータベースでこのクエリを試すこともできます。

もう 1 つの方法は、次のように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>

問題の原因となっているアイテムがログに表示されるはずです。

于 2013-01-23T22:13:36.380 に答える
0

構成ファイルを調べて、この不思議な DLL への参照が見つかるかどうかを確認してください。

ヒント: /sitecore/admin/showconfig.aspx を参照して、メインの web.config からの完全な構成設定とすべてのインクルード構成ファイルを確認します。私の予感は、インデックスの再構築後に起動される DLL を参照するカスタム ハンドラーがあることです。

于 2013-01-24T04:41:25.500 に答える