在使用.NET / COM Interop通过TOM API创建组件时遇到问题。
我有550个组件要通过自定义页面创建。我能够创建400到470个组件,但之后它会失败并通过错误消息说明
Error: Thread was being aborted.
任何想法/建议,为什么会失败?
或
对Tridion 2009有任何限制吗?
根据@ 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.
...
...
...
@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;
}
提前致谢。
答案 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"/>
通过此更改,自定义页面现在可以处理。
任何更好的建议,请发布。