Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!

摘要:
如果调试本机代码正常,插件调试可以查看我的两篇博文:DynamicsCRM插件开发教程:Dynamics365CustomerEngagement中的插件调试和插件调试。如果调试非本机代码,则需要使用远程调试,这更令人讨厌。为了便于演示,我监控了罗勇测试实体的PostUpdate插件中ownerid字段的更改,使用的插件代码如下:protectedvoidExecutePostTestOwnerIdUpdate{if{thrownewArgumentNullException;}//TODO:实现您的自定义plug-inbusinesslogical.localContent.TracingService.Trace(“在PostTestOwnerId分配插件中输入代码!”;annotationEntity[“objectid”]=newEntityReference;服务创建;}}插件也在PostAssign消息中注册。代码如下:protectedvoid ExecutePost-TestAssign{if{thrownewArgumentNullException;}//TODO:ImplementyourcustomPlug-inbusinesslogical.localContext.TracingService.Trace(“在PostTestAssign插件中输入代码!”);IPluginExecutionContextcontext=localContext.PluginExecution上下文;varservice=localContext.OrganizationService;如果{EntityannotationEntity=newEntity;annotation实体[“subject”]=“这是由POSTSAssign消息中注册的插件生成的!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me
还记得以前调试插件或者自定义工作流代码吗?如果是调试本机的代码还好,插件调试可以查考我这两篇博文:Dynamics CRM插件开发教程之:插件的调试 和 Dynamics 365 Customer Engagement中插件的调试 ,如果是调试非本机代码,需要使用远程调试,更麻烦。现在好多了,新增了一个名称为 PluginTraceLog 的实体,在插件或者自定义工作流中可以调用 ITracingService 服务来向这个实体写入数据,并且在CRM界面上可见,为了使用它,我们需要先开启,导航到 设置 > 管理 > 系统设置 > 自定义,可以看到有三个选项,默认是关闭,还有异常和所有两个选项,我这里先设置为 所有 来看看效果。
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第1张
 
为了方便演示,我在罗勇测试实体的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("罗勇故意抛出的异常!");
    }
}
我在界面上更改了记录的负责人在在 设置 > 插件跟踪日志 可以看到如下日志:
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第2张
 
我打开消息名称为Assign的那个插件跟踪日志进去看看,触发的实体,配置,安全配置,消息名称,类型名称(执行代码的类名称),操作类型,模式,执行开始时间,执行持续时间都有,消息块里面记录了 TracingService.Trace 写入的消息。
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第3张
 
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第4张
 
如果插件中产生异常呢?我故意使用如下代码在PostTestAssign中抛出一个异常:

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

界面如下所示:
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第5张
 
查看插件日志就会有异常记录了,但是有两条:
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第6张
 
打开一条PostTestAssign看看,在日志中的异常详细信息字段有如下的值,而PostTestOwnerIdUpdate的记录的异常详细信息字段则没有值。
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第7张
 
这里值得一提的是,虽然Assign报错了,但是Update插件没有报错,所以记录的Update是成功了的,应该也是相当于更改了负责人的。
下面我们将系统设置中的启用插件跟踪日志的日志记录设置为 异常 ,就会只记录产生异常时候插件的日志消息。
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第8张
 
更改记录负责人还是报错,但是记录下来的日志就少了,只有产生异常的Assign消息的日志了,没有产生异常的Update消息的日志没有了。
Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!第9张
 
 
 

 
 

免责声明:文章转载自《Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]Android使用WebView从相册/拍照中添加图片js 利用image对象实现图片的预加载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)

在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在网上查了好多资料,发现问这个问题的人多,回答的少,回答的也多数都是:引用System.Web,不要用HttpContext.Current.Applicati...

FLINK基础(107): DS算子与窗口(18)窗口 (3) window functions(二)ProcessWindowFunction

ProcessWindowFunction   一些业务场景,我们需要收集窗口内所有的数据进行计算,例如计算窗口数据的中位数,或者计算窗口数据中出现频率最高的值。这样的需求,使用ReduceFunction和AggregateFunction就无法实现了。这个时候就需要ProcessWindowFunction了。 先来看接口定义 public abstr...

Eclipse Code Template 设置自动加注释(转)

Eclipse Code Template 设置自动加注释 设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一介绍: 文件(Files)注释标签: /*** @Title: ${fi...

iOS 设置图片imageView圆角——对图片进行裁剪

以前设置图片圆角总是把imageView设置成圆形,然后设置maskToBounds为YES,其实这样处理很消耗性能,图片多了之后比较卡,最好将图片进行裁剪后显示;这里有个分类可以用: UIImage+wiRoundedRectImage.h #import <UIKit/UIKit.h> @interface UIImage (wiR...

Android 菊花加载工具类

先看看实现效果图 1.首先自定义一个类继承系统ProgressDialog /** * Created by hanbao0928 on 2018/11/1. */ public class DialogUtils extends ProgressDialog { public DialogUtils(Context context)...

Tomcat模型结构

一、请求过程 Tomca的两大组件:Connecter和Container Connecter组件 1、Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response...