2

.NET /COM相互運用機能を使用してTOMAPIを介してコンポーネントを作成しているときに、問題が発生しています。

実際の問題:

カスタムページから作成する550個のコンポーネントがあります。400〜470のコンポーネントを作成できますが、その後失敗し、次のようなエラーメッセージが表示されます。

Error: Thread was being aborted.

何かアイデア/提案、なぜそれが失敗しているのですか?

また

Tridion 2009に制限はありますか?

更新1:

@ user978511リクエストによると、以下はApplicationイベントログのエラーです:-

Event code: 3001 
Event message: The request has been aborted. 
...
...
Process information: 
    Process ID: 1016 
    Process name: w3wp.exe 
    Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
    Exception type: HttpException 
    Exception message: Request timed out. 
...
...
...

更新2:

@Chris:これは私の一般的な関数であり、パラメーターのリストを渡すことによってループで呼び出されます。ここでは、Interopdllを使用しています。

    public static bool CreateFareComponent(.... list of params ...)
    {
        TDSE mTDSE = null;
        Folder mFolder = null;
        Component mComponent = null;

        bool flag = false;

        try
        {
            mTDSE = TDSEInitialize();
            mComponent = (Component)mTDSE.GetNewObject(ItemType.ItemTypeComponent, folderID, null);
            mComponent.Schema = (Schema)mTDSE.GetObject(constants.SCHEMA_ID, EnumOpenMode.OpenModeView, null, XMLReadFilter.XMLReadAll);
            mComponent.Title = compTitle;

            ...
            ...
            ...
            ...

            mComponent.Save(true);

            flag = true;
        }
        catch (Exception ex)
        {
            CustomLogger.Error(String.Format("Logged User: {0}  \r\n Error: {1}", GetRemoteUser(), ex.Message));
        }
        return flag;
    }

前もって感謝します。

4

4 に答える 4

2

タイムアウトのように聞こえますが、カスタムページをホストしているIISで発生する可能性があります。それらすべてを1つの同期リクエストで作成していますか?それは確かにタイムアウトする可能性が高いからです。

代わりに、それらをバッチで作成することもできます。または、操作が非同期で行われていることを確認してから、ステータスを定期的にポーリングすることもできます。

最も簡単なのは、1つのリクエストでたとえば10個のコンポーネントのみを作成し、それが完了するのを待ってから、別の10個を作成することです(おそらく、プログレスバーが付いていますか?:))

于 2012-03-20T11:17:35.277 に答える
2

TDSEオブジェクトの呼び出し方法。ここで「Marshal.ReleaseComObject」プロシージャについて説明します。COMを解放しないと、オブジェクトは膨大なメモリリークにつながる可能性があります。コンポーネントを作成するためのコードは次のとおりです。

private Component NewComponent(string componentName, string publicationID, string parentID, string schemaID)
    {
        Publication publication = (Publication)mTdse.GetObject(publicationID, EnumOpenMode.OpenModeView, null, XMLReadFilter.XMLReadContext);
        Folder folder = (Folder)mTdse.GetObject(parentID, EnumOpenMode.OpenModeView, null, XMLReadFilter.XMLReadContext);
        Schema schema = (Schema)mTdse.GetObject(schemaID, EnumOpenMode.OpenModeView, publicationID, XMLReadFilter.XMLReadContext);
        Component component = (Component)mTdse.GetNewObject(ItemType.ItemTypeComponent, folder, publication);
        component.Title = componentName;
        component.Schema = schema;
        return component;
    }

その後、mTdseをリリースすることを忘れないでください(私の場合、以前に作成されたTDSEオブジェクトです)。「コンポーネント」オブジェクトの破棄は、それらの操作が終了した後でも役立ちます。

于 2012-03-22T08:14:16.510 に答える
0

大規模なTridionバッチ操作の場合、私は常にコンソールアプリケーションを使用し、サーバー上で直接実行します。

Console.WriteLineを使用して出力ウィンドウに書き込み、Console.ReadLineをアプリのコードの最後の行として書き込みます(ウィンドウが開いたままになるようにします)。Log4Netもロガーとして使用しています。

これは、サーバー上のリモートセッションにアクセスできる場合、または管理者に実行してネットワーク共有を介してログフォルダーにアクセスできるようにする場合に最適なアプローチです。

于 2012-03-20T16:56:17.003 に答える
0

@chrisの提案と即時修正の一部に従って、実行タイムアウトを秒に変更web.configました8000

<httpRuntime executionTimeout="8000"/>

今回の変更により、現在、カスタムページで対応できるようになりました。

これ以上の最良の提案は、投稿してください。

于 2012-03-21T04:26:29.613 に答える