Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SDL Tridion 2009:通过TOM API(通过互操作)创建组件失败_Tridion_Tridion2009 - Fatal编程技术网

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

SDL Tridion 2009:通过TOM API(通过互操作)创建组件失败,tridion,tridion2009,Tridion,Tridion2009,在使用.NET/COM互操作通过TOM API创建组件时,我遇到了一个问题 实际问题: 我有550个组件要通过自定义页面创建。我能够创建400-470个组件,但是在那之后,它就失败了,并且通过一条错误消息说 Error: Thread was being aborted. 任何想法/建议,为什么会失败 或 Tridion 2009有任何限制吗 更新1: 根据@user978511请求,以下是应用程序事件日志上的错误:- Event code: 3001 Event message: The

在使用.NET/COM互操作通过TOM API创建组件时,我遇到了一个问题

实际问题: 我有550个组件要通过自定义页面创建。我能够创建400-470个组件,但是在那之后,它就失败了,并且通过一条错误消息说

Error: Thread was being aborted.
任何想法/建议,为什么会失败

Tridion 2009有任何限制吗

更新1: 根据@user978511请求,以下是
应用程序
事件日志上的错误:-

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

提前感谢。

听起来像是超时,很可能是在承载自定义页面的IIS中。 您是否在一个同步请求中创建它们?因为这确实可能会暂停

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


最简单的方法就是在一个请求中只创建10个组件,等待它完成,然后再创建10个组件(可能有一个漂亮的进度条?:)

听起来像是超时,最有可能是在承载自定义页面的IIS中。 您是否在一个同步请求中创建它们?因为这确实可能会暂停

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


最简单的方法就是在一个请求中只创建10个组件,等待它完成,然后再创建10个组件(可能有一个漂亮的进度条?:)

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

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


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

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

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


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

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

<httpRuntime executionTimeout="8000"/>

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


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

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

<httpRuntime executionTimeout="8000"/>

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


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

如何称呼TDSE对象。我想在这里提到“Marshal.ReleaseComObject”程序。如果不释放COMs对象,可能会导致巨大的内存泄漏。 以下是创建组件的代码:

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对象)。在处理完“组件”对象后,处理它们也很有用

如何调用TDSE对象。我想在这里提到“Marshal.ReleaseComObject”程序。如果不释放COMs对象,可能会导致巨大的内存泄漏。 以下是创建组件的代码:

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对象)。在处理完“组件”对象后,处理它们也很有用

应用程序、Tridion和Tridion Content Manager事件日志中是否有任何内容?您能否分享有关代码上下文的更多信息。i、 是否在ASP.NET页面、控制台应用程序等中?另外,您是否确定使用TOM.NET而不是TOM with interop(我这样问是因为Tridion 2009中的TOM.NET是只读的,所以您似乎不太可能使用它保存任何组件)?Tridion2009(我已经使用TOM和TOM.NET导入了数万个项目)中没有关于您可以导入的项目数量的限制。也许您可以分享一些代码,详细说明何时抛出错误。@user978511:我已经用应用程序事件日志更新了我的问题。在其他两个地方(Tridion和Tridion内容管理器)没有任何错误。@chrisummers:我已经在问题中添加了我的代码。我正在使用C#上的互操作dll来创建这个自定义页面。@nuolinhares-这并不挑剔。这是这个问题的一个关键方面。应用程序、Tridion和Tridion Content Manager事件日志中是否有任何内容?您能否分享更多关于代码上下文的信息。i、 是否在ASP.NET页面、控制台应用程序等中?另外,您是否确定使用TOM.NET而不是TOM with interop(我这样问是因为Tridion 2009中的TOM.NET是只读的,所以您似乎不太可能使用它保存任何组件)?Tridion2009(我已经使用TOM和TOM.NET导入了数万个项目)中没有关于您可以导入的项目数量的限制。也许您可以分享一些代码,详细说明何时抛出错误。@user978511:我已经用应用程序事件日志更新了我的问题。在其他两个地方(Tridion和Tridion内容管理器)没有任何错误。@chrisummers:我已经在问题中添加了我的代码。我正在使用C#上的互操作dll来创建这个自定义页面。@nuolinhares-这并不挑剔。这是一个