CRM 2011 - ITracingService 在运行时获取对 traceInfo 的访问权限

CRM 2011 - ITracingService getting access to the traceInfo at runtime

我的插件中有一些自定义日志记录,我想在我的自定义日志记录中包含我的 tracingService 的内容(在插件完成之前在 catch 块中调用)。

我似乎无法访问tracingService 的内容。我想知道它是否可以访问?

我尝试了 tracingService.ToString() 以防开发人员提供了有用的重载,唉,正如预期的那样,我得到了 class "Microsoft.Crm.Sandbox.SandboxTracingService".

的名称

显然,如果需要,Dynamics CRM 会在管道末尾使用 tracingService 内容。

有人对此有什么想法吗?

亲切的问候, 加里

为了在运行时从 traceService 获取 traceInfo 字符串,我使用调试器询问 tracingService 内容。

因此可以从这些表达式访问跟踪字符串...

插件

((Microsoft.Crm.Extensibility.PipelineTracingService)(tracingService)).TraceInfo 

CWA

((Microsoft.Crm.Workflow.WorkflowTracingService)(tracingService)).TraceInfo 

您可以通过调试和提取表达式来深入跟踪服务。

但是,在设计时,这些表达式似乎都无法从任何标准 CRM 2011 SDK dll 访问...因此不确定是否可行。

跟踪服务在执行期间不提供对跟踪文本的访问,但可以通过创建您自己的 ITracingService 实现来克服。请注意,您无法获取在调用插件的 Execute 方法之前写入跟踪日志的任何文本 - 这意味着如果您有多个插件触发,您将不​​会在抛出的插件中获得它们的跟踪输出异常。

    public class CrmTracing : ITracingService
    {
        ITracingService _tracingService;
        StringBuilder _internalTrace;

        public CrmTracing(ITracingService tracingService)
        {
            _tracingService = tracingService;
            _internalTrace = new StringBuilder();
        }

        public void Trace(string format, params object[] args)
        {
            if (_tracingService != null) _tracingService.Trace(format, args);
            _internalTrace.AppendFormat(format, args).AppendLine();
        }

        public string GetTraceBuffer()
        {
            return _internalTrace.ToString();
        }
    }

只需在您的插件中实例化它,并传入提供的 CRM ITracingService。因为它是同一个接口,所以如果你将它传递给其他 类 和方法,它的工作原理是一样的。

public class MyPlugin : IPlugin
{

    public void Execute(IServiceProvider serviceProvider)
    {
        var tracingService = new CrmTracing((ITracingService)serviceProvider.GetService(typeof(ITracingService)));

        tracingService.Trace("Works same as always.");

        var trace = tracingService.GetTraceBuffer();
    }
}