SDL Tridion 2009: сбой при создании компонентов через TOM API (через Interop) - PullRequest
2 голосов
/ 20 марта 2012

Возникла проблема при создании компонентов через TOM API с использованием .NET / COM Interop.

Фактическая проблема:

У меня есть 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:

@ Крис: Это моя общая функция, которая вызывается в цикле при передаче списка параметров. Здесь я использую Interop DLL.

    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 ]

2 голосов
/ 22 марта 2012

Как вы называете объект 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).Утилизация объекта «Компоненты» может быть полезна и после окончания работы с ними.

2 голосов
/ 20 марта 2012

Звучит как тайм-аут, скорее всего, в IIS, где размещена ваша пользовательская страница. Вы создаете их все в одном синхронном запросе? Потому что это действительно может истечь.

Вместо этого вы можете создать их в пакетном режиме или убедиться, что ваши операции выполняются асинхронно, а затем регулярно опрашивать состояние.

Самым простым было бы просто создать, скажем, 10 компонентов в одном запросе, дождаться его завершения, а затем создать еще 10 (возможно, с хорошим индикатором выполнения? :))

0 голосов
/ 21 марта 2012

В соответствии с @ chris предложениями и частью немедленного исправления я изменил свое web.config время выполнения на 8000 секунды.

<httpRuntime executionTimeout="8000"/>

С этим изменением настраиваемая страница теперь может обрабатываться.

Любое лучшее предложение, пожалуйста, оставьте его.

0 голосов
/ 20 марта 2012

Для больших пакетных операций Tridion я всегда использую консольное приложение и запускаю его прямо на сервере.

Используйте Console.WriteLine для записи в окно вывода и Console.ReadLine в качестве последней строки кода в приложении (поэтому окно остается открытым).Я также использую Log4Net в качестве регистратора.

Это, безусловно, лучший подход, если у вас есть доступ к удаленному сеансу на сервере - или вы можете попросить администратора запустить его для вас и предоставить вам доступ к папке журнала через общий сетевой ресурс.

...