关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me
还记得以前调试插件或者自定义工作流代码吗?如果是调试本机的代码还好,插件调试可以查考我这两篇博文:Dynamics CRM插件开发教程之:插件的调试 和 Dynamics 365 Customer Engagement中插件的调试 ,如果是调试非本机代码,需要使用远程调试,更麻烦。现在好多了,新增了一个名称为 PluginTraceLog 的实体,在插件或者自定义工作流中可以调用 ITracingService 服务来向这个实体写入数据,并且在CRM界面上可见,为了使用它,我们需要先开启,导航到 设置 > 管理 > 系统设置 > 自定义,可以看到有三个选项,默认是关闭,还有异常和所有两个选项,我这里先设置为 所有 来看看效果。

 
为了方便演示,我在罗勇测试实体的Post Update插件中监控了ownerid字段的变更,使用的插件代码如下:
protected void ExecutePostTestOwnerIdUpdate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
} // TODO: Implement your custom Plug-in business logic.
localContext.TracingService.Trace("进入到PostTestOwnerIdAssign插件中的代码了!");
IPluginExecutionContext context = localContext.PluginExecutionContext;
var service = localContext.OrganizationService;
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
Entity currentEntity = context.InputParameters["Target"] as Entity;
localContext.TracingService.Trace(string.Format("新的OwnerId={0}", currentEntity.GetAttributeValue<EntityReference>("ownerid").Id));
Entity annotationEntity = new Entity("annotation");
annotationEntity["subject"] = "这是由注册在POSTOWNERIDUPDATE消息中的插件产生的!";
annotationEntity["objectid"] = new EntityReference(currentEntity.LogicalName, currentEntity.Id);
service.Create(annotationEntity);
}
}
在Post Assign消息中也注册了插件,代码如下:
protected void ExecutePostTestAssign(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
} // TODO: Implement your custom Plug-in business logic.
localContext.TracingService.Trace("进入到PostTestAssign插件中的代码了!");
IPluginExecutionContext context = localContext.PluginExecutionContext;
var service = localContext.OrganizationService;
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
{ Entity annotationEntity = new Entity("annotation");
annotationEntity["subject"] = "这是由注册在POSTASSIGN消息中的插件产生的!";
annotationEntity["objectid"] = context.InputParameters["Target"];
if (context.InputParameters.Contains("Assignee") && context.InputParameters["Assignee"] is EntityReference)
{
localContext.TracingService.Trace(string.Format("新的OwnerId={0}", ((EntityReference)context.InputParameters["Assignee"]).Id));
}
service.Create(annotationEntity);
throw new InvalidPluginExecutionException("罗勇故意抛出的异常!");
}
}
我在界面上更改了记录的负责人在在 设置 > 插件跟踪日志 可以看到如下日志:
 
我打开消息名称为Assign的那个插件跟踪日志进去看看,触发的实体,配置,安全配置,消息名称,类型名称(执行代码的类名称),操作类型,模式,执行开始时间,执行持续时间都有,消息块里面记录了 TracingService.Trace 写入的消息。
 
如果插件中产生异常呢?我故意使用如下代码在PostTestAssign中抛出一个异常:

throw new InvalidPluginExecutionException("罗勇故意抛出的异常!");

界面如下所示:
 
查看插件日志就会有异常记录了,但是有两条:
 
打开一条PostTestAssign看看,在日志中的异常详细信息字段有如下的值,而PostTestOwnerIdUpdate的记录的异常详细信息字段则没有值。
 
这里值得一提的是,虽然Assign报错了,但是Update插件没有报错,所以记录的Update是成功了的,应该也是相当于更改了负责人的。
下面我们将系统设置中的启用插件跟踪日志的日志记录设置为 异常 ,就会只记录产生异常时候插件的日志消息。
 
更改记录负责人还是报错,但是记录下来的日志就少了,只有产生异常的Assign消息的日志了,没有产生异常的Update消息的日志没有了。
 

Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!的更多相关文章

  1. Dynamics CRM 2015/2016新特性之三十二:新增乐观并发处理

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复215或者20160328可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  2. Dynamics CRM 2015/2016新特性之三十三:有了ExecuteTransactionRequest,再也不用担心部分成功部分失败了

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复216或者20160329可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  3. Dynamics CRM 2015/2016新特性之七:有了文档模板,打印分析So Easy

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复190或者20160216可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 从CRM 2015 UR1开始, ...

  4. Dynamics CRM 2015/2016 Web API:Unbound Action 和 Bound Action

    上篇文章介绍了Bound/Unbound Function.今天我们来看看Action吧.像我之前说的:Function和Action之前的差别能够简单理解为.Function不改动数据,可是Acti ...

  5. Dynamics CRM 2015/2016 Web API:Unbound Function 和 Bound Function

    今天我们来看看Dynamics CRM Web API Function 吧, 这是一个新概念,刚接触的时候我也是比較的迷糊.这种命名确实是和之前的那套基于SOAP协议的API全然联系不上.好了,不说 ...

  6. Dynamics CRM 2015/2016 Web API:Unbound Custom Action 和 Bound Custom Action

    今天我们再来看看Bound/Unbound Custom Action吧,什么是Custom Action?不知道的小伙伴们就out了,Dynamics CRM 2013就有了这个功能啦.和WhoAm ...

  7. Dynamics CRM 2015/2016 Web API:新的数据查询方式

    今天我们来看看Web API的数据查询功能,尽管之前介绍CRUD的文章里面提到过怎么去Read数据,可是并没有详细的去深究那些细节,今天我们就来详细看看吧.事实上呢,Web API的数据查询接口也是基 ...

  8. Dynamics CRM 2015/2016 Web API:聚合查询

    各位小伙伴们,今天是博主2016年发的第一篇文章.首先祝大家新年快乐.工资Double,哈哈.今天我们来看一个比較重要的Feature--使用Web API运行FetchXML查询! 对的,各位.你们 ...

  9. 【原创】Dynamics CRM 2015/2016,以PDF的形式打开SSRS报表。

    基本步骤: 使用SSRS建立报表,以下的例子是以记录的GUID作为报表的参数 获取ReportSession 和 ControlId来调用报表 以PDF的形式预览报表 一.根据报表的名称获取报表的GU ...

随机推荐

  1. OA表单制作(致远)

    第一步.导入已经制作好的xnl表单文件. 第二步.对每个字段设置相关属性. 1.设置文本属性,录入类型选择文本框. 2.设置日期属性,录入类型选择日期控件. 3.设置引用类型,录入类型选择关联表单-- ...

  2. 敏捷开发--洞察敏捷模型,从PO的角度看敏捷产品管理

    转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo)       经常有人抱怨的一个问题:敏捷会让团队自组织,要求团队能“一方有难,八方支援”,但是为什么总感觉自己团队虽然实践了敏捷, ...

  3. 用百度大脑技术让AI做回新闻主播!

    实现效果: 利用百度新闻摘要能力和微信小程序,快速抽取新闻摘要内容并进行语音播报,让AI做回新闻主播!本文主要介绍小程序功能开发实现过程,分享主要功能实现的子程序模块,都是干货哦!! 想了解pytho ...

  4. JDK1.8新特性-Lambda表达式

    Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...

  5. day07什么是方法、方法的定义、方法的调用

    复习 1.数组 1)什么是数组 数组就是一种能够保存 多个相同数据类型的数据的变量 2)为什么使用数组 3)数组的构成 3.1)数组名 3.2)数组元素 3.3)数组长度 3.4)数组下标 4)数组的 ...

  6. IT兄弟连 HTML5教程 CSS3属性特效 3D变换1

    3D变换较2D变换多了一下的转换属性,3D转换属性及描述如表1: 表1  3D转换属性 3D的转换方法如表2: 表2  3D转换方法     1  transform-style transform- ...

  7. IT兄弟连 HTML5教程 CSS3属性特效 新增颜色模式

    对于设计人员和开发人员来说,CSS一直是web设计过程中重要的一部分.网页外观主要由CSS控制,编写CSS代码可以任意改变我们的网页布局以及网页内容的样式.随着CSS3的出现以及越来越多的浏览器对它的 ...

  8. nltk的安装和简单使用

    使用python进行自然语言处理,有一些第三方库供大家使用: ·NLTK(Python自然语言工具包)用于诸如标记化.词形还原.词干化.解析.POS标注等任务.该库具有几乎所有NLP任务的工具. ·S ...

  9. centos7上安装jdk1.8

    我这里是使用的jdk1.8:由于vmware上的字体太小,所以我使用xShell链接linux系统进行操作的. 准备工作:使用xftp链接linux系统:然后创建个包将linux版本的jdk上传上去: ...

  10. js 注意事项使用误区

    1.加法注意事项 2.浮点数注意事项 3.js,数组需使用数字作为下标索引,不支持关联数组的用法.对象不能混淆使用数组的length方法,并且不能使用数字作为下标,得使用属性值作为下标使用,否则会返回 ...