SDL Tridion 2009:通过TOM API(通过Interop)创建组件失败

时间:2012-03-20 08:01:48

标签: tridion tridion2009

在使用.NET / COM Interop通过TOM API创建组件时遇到问题。

实际问题:

我有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:这是我的常用函数,它通过传递params列表在循环中调用。这里使用的是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 个答案:

答案 0 :(得分:2)

听起来像是超时,很可能是在IIS中托管您的自定义页面。 您是在一个同步请求中创建它们吗?因为那确实可能超时。

您可以批量创建它们 - 或者确保您的操作是异步完成的,然后定期轮询状态。

最简单的只是在一个请求中创建说10个组件,等待它完成,然后创建另一个10(可能有一个很好的进度条?:))

答案 1 :(得分: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对象)。在完成使用它们之后,处理“组件”对象也很有用。

答案 2 :(得分:0)

对于大型Tridion批处理操作,我总是使用控制台应用程序并直接在服务器上运行它。

使用Console.WriteLine写入输出窗口,使用Console.ReadLine作为应用程序中的最后一行代码(因此窗口保持打开状态)。我还使用Log4Net作为记录器。

如果您可以访问服务器上的远程会话,这是目前最好的方法 - 或者可以要求管理员为您运行它,并允许您通过网络共享访问日志文件夹。

答案 3 :(得分:0)

根据 @chris 建议和即时修复的一部分,我已将web.config执行时间更改为8000秒。

<httpRuntime executionTimeout="8000"/>

通过此更改,自定义页面现在可以处理。

任何更好的建议,请发布。