2

在使用 .NET/COM 互操作通过 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:这是我的常用函数,通过传递参数列表在循环中调用。这里使用的是互操作 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

4 回答 4

2

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

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

最简单的就是在一个请求中只创建 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

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

<httpRuntime executionTimeout="8000"/>

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

有什么更好的建议,请贴出来。

于 2012-03-21T04:26:29.613 回答
0

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

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

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

于 2012-03-20T16:56:17.003 回答