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

Web API在Dynamics CRM中的功能越来越强大,Dynamics 365 (Dynamics CRM V8.2) 又增加了一些通过通过Web API可以执行的操作(Action) ,比如 ExecuteWorkflow这个Action,具体Web API可以执行哪些操作呢?可以参考SDK的 Web API Action Reference 章节,也有在线版本,在线版本是 Web API Action Reference 。当然,这个章节的内容会变化,要查看Dynamics CRM对应版本的SDK。今天要讲解的是利用Fiddler的Replay功能通过Web API调用操作。

在继续阅读之前,如果你对通过Web API执行操作没有概念,强烈建议你先阅读我的文章:Dynamics CRM 2015/2016新特性之二十四:使用Web API执行操作 。

我们先看 ExecuteWorkflow Action 的说明,可以知道它是一个绑定操作, 它有一个输入参数 EntityId ,也有返回参数,是个asyncoperation 实体记录类型。为了测试需要,先要找一个工作流,我这里有一个工作流如下,我这里故意没有选中 作为按需流程 ,是因为我想看看不选中这个是否也可以通过代码执行这个工作流,当然在界面上通过运行工作流此时是找不到这个工作流的。

然后我需要找一条这个工作流对应实体的一条记录,我这里选择一条记录。顺便介绍下如何获取记录ID的方法,右击一条记录,选择 在新窗口中打开 。

然后就会在新窗口中打开,可以看到打开记录时候的URL是类似: https://demo.luoyong.me/main.aspx?etc=10007&extraqs=&histKey=789763582&id=%7bB907DE1B-CF99-E611-8161-000D3A80C8B8%7d&newWindow=true&pagetype=entityrecord&sitemappath=SFA%7cExtensions%7cly_test#348434379 。这个URL中的id=%7b 和 %7d之间的就是这个记录的ID。

我们还需要执行的工作流的ID,在解决方案中双击打开该工作流,有类似这样的URL:https://demo.luoyong.me/sfa/workflow/edit.aspx?_CreateFromId=%7b2721DA92-65A4-E511-80CB-000D3A80CE7F%7d&_CreateFromType=7100&appSolutionId=%7b2721DA92-65A4-E511-80CB-000D3A80CE7F%7d&id=%7b6BEBC426-F722-4B64-AE5D-0DA379F8A8C4%7d

同样的我们可以拿到这个工作流的ID。

我这里借助Fiddler来Replay,启用Fiddler抓包,右击一个请求,选择 Replay > Reissue from Composer.

在Fiddler的Composer中打开页面类似如下:

然后我们就可以更改请求方法,请求URL,请求头Header和请求体Body。我这里更改如下:

POST的URL我改成了:https://demo.luoyong.me/api/data/v8.2/workflows(6BEBC426-F722-4B64-AE5D-0DA379F8A8C4)/Microsoft.Dynamics.CRM.ExecuteWorkflow

Request Body我改成了如下,特别注意这个Cookie的元素值要保留,用来认证的,当然也会过期:

Content-Type: application/json; charset=utf-8
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Cookie: ReqClientId=dff59da0-52dd-42f9-8ab9-e62ad9b24e57; e9cd027f-26a3-e511-80c6-000d3a807ec7_bd2a5c49-6b08-4eda-8a15-84159d9fd349=/Date(1478082706255)/; persistentNavTourCookie=HideNavTour; CRM_MSG_BAR_ServiceDeskAlert%23e9cd027f-26a3-e511-80c6-000d3a807ec7=HideMessage; MSISAuth=77u/PD94bWwgdmVyc2lvbj0iMSlSNWN6UEdTQm9Md0FnQUFFWU8ydHhxQXNxTVo0NS83WUJRL3pGdk1ZWndQWld6RnhjcVhHYWx6ZjZscFVsUVBnVWprSnArVVZYY0IxcGNsMXF5VmZ0UVm5nVnFSc3pxV1RKbjlrMWxlRWhB; MSISAuth1=M3VIZmdZZmVF0eUNvbnRleHRUb2tlbj4=; CRM_MSG_BAR_e9cd027f-26a3-e511-80c6-000d3a807ec7GetAppsForCrm=HideMessage; CRM_MSG_BAR_EnableS2SAlert%23e9cd027f-26a3-e511-80c6-000d3a807ec7=HideMessage

Request Body我改成了:

{"EntityId":"B907DE1B-CF99-E611-8161-000D3A80C8B8"}

我执行的话会返回HTTP Status为500,内部错误:

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; odata.metadata=minimal
Expires: -1
Server: Microsoft-IIS/8.5
REQ_ID: 5b92fe5f-7856-4817-bc18-210b20fa2b08
OData-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 24 Jul 2017 15:33:39 GMT
Content-Length: 2869

{
"error":{
"code":"","message":"Workflow must be marked as on-demand or child workflow.","innererror":{
"message":"Workflow must be marked as on-demand or child workflow.","type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]","stacktrace":" at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, ExecutionContext executionContext)\r\n at Microsoft.Crm."
}
}
}

提示很清晰,工作流必须要选中 作为按需流程 或者是子流程才行。于是我停用该工作流,然后激活该工作流,再来尝试,执行结果如下:

如果查看原版的返回内容是这样的:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; odata.metadata=minimal
Expires: -1
Server: Microsoft-IIS/8.5
REQ_ID: 0ad59cc7-ab4e-49bf-a05b-8b522db29c75
Preference-Applied: return=representation
OData-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 24 Jul 2017 15:39:04 GMT
Content-Length: 38136

{
"@odata.context":"https://demo.luoyong.me/api/data/v8.2/$metadata#asyncoperations/$entity","statecode":0,"asyncoperationid":"f9349b37-8670-e711-826c-000d3a80c8b8","_regardingobjectid_value":"b907de1b-cf99-e611-8161-000d3a80c8b8","_owningextensionid_value":"c8556024-8670-e711-826c-000d3a80c8b8","createdon":"2017-07-24T15:39:03Z","_workflowactivationid_value":"c8556024-8670-e711-826c-000d3a80c8b8","depth":1,"messagename":"ExecuteWorkflow","_ownerid_value":"e9cd027f-26a3-e511-80c6-000d3a807ec7","name":"\u7f57\u52c7\u6d4b\u8bd5\u5b9e\u4f53\u5b57\u6bb5\u503c\u53d8\u66f4\u540e\u8fd0\u884c\u7684\u5de5\u4f5c\u6d41","requestid":null,"friendlymessage":null,"retrycount":null,"startedon":null
}

可以看到执行成功,我去界面上也可以看到执行了工作流:

利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例的更多相关文章

  1. 不借助工具在浏览器中通过Web API执行Dynamics 365操作(Action)实例

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

  2. 利用Fiddler修改请求信息通过Web API执行操作(Action)实例

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

  3. Fiddler修改请求的参数,重新执行请求

    打开Fiddler4,打开浏览器,输入请求地址,例如:http://www.meizu.com 1.  拿出host信息:tongji.meizu.com 2.  拿出URL信息:/flow/mc?v ...

  4. 使用JS通过Web API执行批量操作,多个操作是一个事务!

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

  5. Fiddler修改请求、返回数据

    相信你们有听过说“绕过前端”,但是可能想不到要怎样才能绕过前端呢? 首先,我们要知道什么是绕过前端?比如:登录用户名限制数字.6位,用户在登录页面填写用户名符合要求,使用Fiddler作为代理,拦截登 ...

  6. AngularJS使用OData请求ASP.NET Web API资源的思路

    本篇整理AngularJS使用OData请求ASP.NET Web API资源的思路. 首先给ASP.NET Web API插上OData的翅膀,通过NuGet安装OData. 然后,给control ...

  7. Web API 2 入门——Web API 2中的操作结果(谷歌翻译)

    在这篇文章中 空虚 HttpResponseMessage IHttpActionResult 其他返回类型 作者:Mike Wasson 本主题描述ASP.NET Web API如何将控制器操作的返 ...

  8. 通过C#代码调用Dynamics 365 Web API执行批量操作

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  9. Fiddler修改请求和响应

    通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过"伪造"相应信息达到达到相应的目的(调试,模 ...

随机推荐

  1. PyTorch--双向递归神经网络(B-RNN)概念,源码分析

    关于概念: BRNN连接两个相反的隐藏层到同一个输出.基于生成性深度学习,输出层能够同时的从前向和后向接收信息.该架构是1997年被Schuster和Paliwal提出的.引入BRNNS是为了增加网络 ...

  2. Java多线程可以分组,还能这样玩!

    前面的文章,栈长和大家分享过多线程创建的3种方式<实现 Java 多线程的 3 种方式>. 但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java ...

  3. HBase之RPC调用流程简介

    首先分析hbase中对于master协议的调用: 在ConnectionImplementation的方法getKeepAliveMasterService被调用时,会通过MasterServiceS ...

  4. python基础-文件操作(10)

    一.什么是文件 等等这些都叫做文件,各种格式的.但不仅仅限制于这些. 二.文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了 ...

  5. java提高(1)---异常

    异常 一.异常与错误的区别 再讲异常之前我们就应该要知道异常和错误的区别 Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系 ...

  6. 课程回顾-Convolutional Neural Networks

    为什么卷积层计算量更低paddingStrided convolution多维卷积LeNet 参数卷积网络的好处参数共享稀疏连接经典网络实现LeNet-5AlexNetVGGResNet残差块iden ...

  7. HashMap source code view(1)

    前言 HashMap source code view 类注释 Hash table based implementation of the Map interface. This implement ...

  8. python干掉pycache

    当第一次运行 python 脚本时,解释器会将 *.py 脚本进行编译并保存到 __pycache__ 目录 下次执行脚本时,若解释器发现你的 *.py 脚本没有变更,便会跳过编译一步,直接运行保存在 ...

  9. 跟面试官聊.NET垃圾收集,直刺面试官G点

    装逼的面试官和装逼的程序员 我面试别人的时候,经常是按这种路子来面试: 看简历和面试题,从简历和面试题上找到一些技术点,然后跟应聘者聊. 聊某个技术点的时候,应聘者的回答会牵涉到其他的技术点,然后我会 ...

  10. 使用vue之directive设计列表加载更多

    背景 之前写过一篇<纯JS实现加载更多(VUE框架)>,它的逻辑思路比较清晰易懂,而今天看了一天公司项目的部分功能代码,发现同事们写的加载更多的功能更加的有趣,而且易于封装到一个组件当中, ...