2

我无法使用 CoreService SessionAwareCoreServiceClient 删除任何项目。我能够创建/读取组件,创建文件夹...... 作为一个错误,我得到“对象引用未设置为对象的实例”。我想指出,我在 Tridion Content Manager 机器之外的应用程序中使用了核心服务。以下是来自 CM 服务器的日志:

用户:NT AUTHORITY\NETWORK SERVICE

StackTrace 信息详细信息:在 Tridion.UGC.EventHandler.UGCEventHandler.GetDataSourcesForTCM(String[] tcm) 在 Tridion.UGC.EventHandler.UGCEventHandler.DeleteItemStats(TcmUri tcm)
在 Tridion.UGC.EventHandler.UGCEventHandler.HandlerForComitted(IdentifiableObject subject, DeleteEventArgs args, EventPhases 阶段) 在 System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo 方法, 对象目标, Object[] 参数, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 在系统。 RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,Object[] 参数,签名 sig,MethodAttributes methodAttributes,RuntimeType typeOwner)在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化, Boolean skipVisibilityChecks) 在 System.Delegate.DynamicInvokeImpl(Object[] args) 在 Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable1 subjects, TcmEventArgs eventArgs, EventPhases phase) at Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IEnumerable1 个主题,TcmEventArgs eventArgs,EventDeliveryPhase deliveryPhase)
在 Tridion.ContentManager.Extensibility.EventSystem.DeliverEvent(IdentifiableObject 主题,TcmEventArgs eventArgs,EventDeliveryPhase deliveryPhase)
在 Tridion.ContentManager.IdentifiableObject.Delete(DeleteEventArgs deleteEventArgs) 在 Tridion.ContentManager.IdentifiableObject.Delete( ) 在 Tridion.ContentManager.CoreService.CoreServiceBase.Delete(String id)
在 SyncInvokeDelete(Object , Object[] , Object[] ) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] 输入, Object[]& 输出) 在 Tridion.ContentManager.CoreService.TransactionSupportInvoker.Invoke(Object实例,Object[] 输入,Object[]& 输出)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime。 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 的 ProcessMessage41(MessageRpc& rpc) System.ServiceModel 的 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)。Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) ) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)rpc) 在 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:我已经尝试使用带有基本 http 端点的常规 CoreService 并且仍然得到相同的错误。因此,身份验证不会在这里造成问题。UGC 事件似乎出了点问题。不幸的是,我没有代码源,也没有关于启用 UGC 的 dll 的任何其他信息。

4

1 回答 1

5

stacktrace 提到了 UGCEventHandler,所以我假设 UGC 已安装,您可以尝试暂时禁用此事件系统,看看是否有帮助,但我认为这不是问题的根源,因为您提到您可以手动删除那个用户。

但是,您提到“...在我的 Tridion Content Manager 机器之外的应用程序中使用核心服务”,并且您正在使用会话感知核心服务。

编辑:所以您使用的是会话感知核心服务客户端,并且您也提供了密码。这并没有真正加起来,会话感知核心服务客户端应该用于您的用户帐户已经过身份验证的情况,或者当您通过有效的 SDL Tridion Impersonation 用户调用核心服务时,您可以模拟核心服务仅通过用户名调用有效的 SDL Tridion 用户名(无需密码)。

尝试使用常规的核心服务客户端,如下所述:获取没有配置文件的核心服务客户端

或者,如果您坚持使用 Session Aware Core Service Client(我认为您的情况是错误的),请确保您的应用程序在有效的 SDL Tridion Impersonation 用户下运行(因为您在外部服务器上运行,您需要添加域帐户在 SDL Tridion MMC 管理单元中),然后像这样模拟核心服务客户端:

using (SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient())
{
    // impersonate with valid user
    client.Impersonate("SDL Tridion Username here");
    // use client
    client.Delete(...);
}
于 2012-11-21T10:46:47.433 回答