我已经针对CRM 2013编写了一个自定义工作流活动。您无需了解它的作用。我遇到的问题是,尽管实例化了ITracingService
,但我使用Trace(...)
方法生成的任何跟踪内容在运行时仅对实时工作流进行模糊处理。换句话说,如果我异步运行我的工作流并且(故意)抛出异常,我会在相应的系统作业记录中看到跟踪日志。如果我只是将工作流程切换为“实时”(同步),那么我仍然会得到一个例外,我仍然可以获得任何自定义异常文本,但当然没有相应的systemjob
为实时工作流生成,所以,就像插件一样,我在可下载的日志文件中寻找我的Trace输出,该文件在发生异常时显示。在这种情况下,我的Traces不可见但是我从(可能)托管工作流的父上下文得到了Microsoft的跟踪日志 - 您可以看到它引用了我的工作流程过程定义中的步骤:
[Microsoft.Crm.ObjectModel: Microsoft.Crm.Extensibility.InternalOperationPlugin]
[46f6cf4c-14ae-4f1e-98a1-eae99a37e95c: ExecuteWorkflow]
Starting sync workflow 'MyTestWorkflow', Id: ca8782b1-7ca4-e311-a055-6c3be5be5f78
Entering CreateStep1_step:
Entering CustomActivityStep2_step:
Sync workflow '__Test' terminated with error 'Unexpected exception from plug-in (Execute): My.Test.WF.DoSomething: System.NullReferenceException: Object reference not set to an instance of an object.'
在我的程序集My.Test.WF.DoSomething
中,我在调用时访问了跟踪服务,并立即通过Trace()
方法开始编写,例如
_trace.Trace("Starting Greg's custom code...");
这只是一个例子,但重点是,我的跟踪在异步时起作用,但在同步时“丢失”。
有什么想法吗?
答案 0 :(得分:2)
相应工作流程设计器表单上的流程会话部分包含完整的异常消息。
答案 1 :(得分:0)
问题是完整的异常消息不包含通过ITracingService Trace方法创建的跟踪,只包含平台抛出的异常,进程部分的注释选项卡中不包含任何用户跟踪。
我认为开发目的的最佳方法是使用StringBuilder而不是ITracingService,并使用StringBuider.toString()作为消息抛出异常。 至于生产版本,最好的方法可能是使用自定义实体来跟踪运行时的错误,或者根本不在同步工作流上使用自定义工作流活动。
干杯。