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


    关注本人微信和易信公众号: 微软动态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消息的日志没有了。
     
     
     

     
     
  • 相关阅读:
    表单提交方式
    js--dom对象
    js--bom对象
    css布局的漂浮、position定位
    python语法学习第五天--lambda表达式、filter()、map()
    python语法学习第五天--函数(2)
    python3语法学习第五天--函数(1)
    python3语法学习第四天--序列
    leetcode| 84. 柱状图中最大的矩形
    leetcode| 56. 合并区间
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_CRM_2016_New_Feature_PluginTraceLog.html
Copyright © 2020-2023  润新知