SDL Tridion 2009:通过TOM API(通过互操作)创建组件失败
在使用.NET/COM互操作通过TOM API创建组件时,我遇到了一个问题 实际问题: 我有550个组件要通过自定义页面创建。我能够创建400-470个组件,但是在那之后,它就失败了,并且通过一条错误消息说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
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-这并不挑剔。这是一个