关注本人微信和易信公众号: 微软动态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. .Net Core2.2升级到3.1小记

    .NET Core 3.1 作为LTS长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗). 目前主流的第三方包大多都已经提供了支持,2.x => 3.1还是变化不是特别多,EF ...

  2. 4. abp中的asp.net core模块剖析

    相关模块 AbpAspNetCoreModule AbpAspNetCoreMvcModule AbpAspNetCoreMvcContractsModule abp通过这三个模块加载并配置了 asp ...

  3. ElasticSearch 时间格式

    "datetime": { "type": "date", "format": "yyyy-MM-dd HH: ...

  4. C#字符串与时间格式化

    需要将其它类型的变量,转换为字符串类型的一些常见方法与属性. 字符型转换为字符串 // C 货币 2.5.ToString("C"); // ¥2.50 // D 10进制数 .T ...

  5. Vue学习笔记Day1

    1.vue初时 vue安装三种方式: 1:CDN引入 以下推荐国外比较稳定的两个 CDN,国内还没发现哪一家比较好,目前还是建议下载到本地. Staticfile CDN(国内) : https:// ...

  6. 携程PMO--扑克派对,我的估算我做主!

    转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo)     作者简介   Ollie Guan,携程PMO高级项目集经理,负责敏捷总动员及携程技术中心PMO微信公众号运营.上海AUG ...

  7. Python: simple code

    # !/usr/bin/env python3.6 # -*- coding: utf-8 -*- # visual studio 2017 # 2019 10 12 Geovin Du print ...

  8. Android Studio中的AndroidManifest.xml文件分析

    一.关于AndroidManifest.xml AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Acti ...

  9. Spring Boot2.2.X中Tomcat配置 错误定制

    1: Tomcat定制 EmbeddedServletContainerCustomizer 已久废弃 按照下面的方式来处理 通过的类的配置 @Component public class Tomca ...

  10. 阿里云服务器搭建web项目小结

    前言 最近恰好有时间,自己搞了个云服务器试着搭建了个网站,遇到了一些问题,通过踩坑也涨了一些经验,遂记录一二,与后来者分享. 正文 1.博主用的阿里云服务器,为什么用它呢?一个是恰逢双十一,有优惠:另 ...