我无法使用CoreService SessionAwareCoreServiceClient删除任何项目。我能够创建/读取组件,创建文件夹......作为一个错误,我得到“对象引用未设置为对象的实例”。我想请注意,我在Tridion Content Manager机器之外的应用程序中使用核心服务。以下是来自CM服务器的日志:
用户:NT AUTHORITY \ NETWORK SERVICE
StackTrace信息详情:at Tridion.UGC.EventHandler.UGCEventHandler.GetDataSourcesForTCM(字符串[] tcm)at Tridion.UGC.EventHandler.UGCEventHandler.DeleteItemStats(TcmUri tcm)
在 Tridion.UGC.EventHandler.UGCEventHandler.HandlerForComitted(IdentifiableObject subject,DeleteEventArgs args,EventPhases阶段)at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,Object []参数,SignatureStruct& SIG, MethodAttributes methodAttributes,RuntimeType typeOwner)at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo方法, Object target,Object []参数,Signature sig,MethodAttributes methodAttributes,RuntimeType typeOwner)at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化, 布尔值skipVisibilityChecks)at System.Delegate.DynamicInvokeImpl(Object [] args)at Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable的1 subjects, TcmEventArgs eventArgs, EventPhases phase) at Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IEnumerable
1 subject,TcmEventArgs eventArgs,EventDeliveryPhase deliveryPhase)
在 Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IdentifiableObject subject,TcmEventArgs eventArgs,EventDeliveryPhase deliveryPhase)
在Tridion.ContentManager.IdentifiableObject.Delete(DeleteEventArgs deleteEventArgs)at Tridion.ContentManager.IdentifiableObject.Delete()at Tridion.ContentManager.CoreService.CoreServiceBase.Delete(String id)
在SyncInvokeDelete(Object,Object [],Object [])at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,对象[]输入,对象[]&输出) Tridion.ContentManager.CoreService.TransactionSupportInvoker.Invoke(对象 实例,对象[]输入,对象[]&输出) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
使用已使用的帐户,我可以手动删除项目,这意味着我拥有正确的权限。任何帮助/建议都不仅仅是可用的......
_client = new SessionAwareCoreServiceClient("wsHttp_2011");
bool useWindowsCredentials = bool.Parse(Environment.EnvironmentUserSettings.UseWindowsCredentials);
var credentials = CredentialCache.DefaultNetworkCredentials;
if (!useWindowsCredentials)
{
string password=Environment.EnvironmentUserSettings.Password;
credentials = new NetworkCredential(Environment.EnvironmentUserSettings.UserName, password);
}
_client.ChannelFactory.Credentials.Windows.ClientCredential = credentials;
此代码用于模拟。在设置文件中,我可以选择是否使用Windows凭据或来自设置文件的凭据。我使用Windows LDAP帐户或手动输入凭据时收到错误。我还没有尝试过使用SDL Administrator。我会尝试并通知你。无论如何,谢谢你的努力
@UPDATE: 我已经尝试使用常规CoreService和基本的http端点,但仍然得到相同的错误。因此,身份验证不会导致问题。看来UGC事件出了问题。不幸的是,我没有代码源也没有关于启用UGC的dll的任何其他信息。
答案 0 :(得分:5)
stacktrace提到了UGCEventHandler,所以我假设安装了UGC,你可以尝试暂时禁用这个事件系统,看看是否有帮助,但我认为它不是问题的根源,因为你提到你能够手动删除该用户。
但是,您提到“......在Tridion Content Manager计算机外部的应用程序中使用核心服务”,以及您正在使用会话感知核心服务。
编辑:您正在使用Session Aware核心服务客户端,并且您也在提供密码。这并没有真正加起来,会话感知核心服务客户端应该用于您的用户帐户已经过身份验证的情况,或者当您通过有效的SDL Tridion模拟用户调用核心服务时,您冒充核心服务仅通过用户名调用有效的SDL Tridion用户名(无需密码)。尝试使用常规核心服务客户端,如下所述:Get Core Service Client without config file。
或者,如果您坚持使用Session Aware核心服务客户端(我认为您的情况不对),请确保您的应用程序在有效的SDL Tridion模拟用户下运行(因为您在外部服务器上运行,您需要在SDL Tridion MMC管理单元中为其添加域帐户,然后模拟核心服务客户端,如下所示:
using (SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient())
{
// impersonate with valid user
client.Impersonate("SDL Tridion Username here");
// use client
client.Delete(...);
}