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

利用OData终结点可以方便的对实体执行增删改查操作,可是要执行其他的消息呢?比如案例的关闭(CloseIncidentRequest)消息,实体的共享消息(GrantAccessRequest) 等等怎么办?大家知道用C#代码执行这些消息很方便简单。但是如果使用JavaScript来执行就需要费点功夫了,但是也是可行的,某些情况下很有用,可以使用JavaScript调用OData终结点来执行任何可以执行的消息。请参考SDK的 Walkthrough: Use the Modern app SOAP endpoint with JavaScript 章节进行操作,我这里就实地演示下,最关键的是获取执行消息时候的请求消息文本,我这里是授人以渔。
 
打开 SDK\SampleCode\CS\Client\SOAPLogger 的这个解决方案,我用的是 Visual Studio 2012打开的,没问题,重新生成下,确保能重新生成成功,如果不成功自己解决。
 
打开解决方案中的 SOAPLogger.cs 文件,找到下面两行代码
//Add the code you want to test here:
// You must use the SoapLoggerOrganizationService 'slos' proxy rather than the IOrganizationService proxy you would normally use.

就是在这里写你要执行的消息,我这里以分享一个客户记录的读取权限给一个CRM的用户为例,C#版本的代码是这么写的:

var request = new GrantAccessRequest()
{
PrincipalAccess = new PrincipalAccess()
{
AccessMask = AccessRights.ReadAccess,
Principal = new EntityReference("systemuser", new Guid("CC06819E-9AD3-E411-80BC-00155D09F02E"))
},
Target = new EntityReference("account", new Guid("FB9A903E-FC3F-E511-80DF-00155D1D7B07"))
};
slos.Execute(request);

确保编译能通过后调试起来,我这里按 F5 启动起来,弹出如下窗口,我输入如下,我这个CRM环境没有做IFD,但是是使用HTTS绑定的,所以第二个选项我输入了Y,大家根据自己的环境做选择啊。

 
按 Enter 键退出程序后在刚才程序的 bin\Debug 目录下找到一个名称为 output.txt 的文件,我这里摘录内容如下:
HTTP REQUEST
--------------------------------------------------
POST https://crm2015.luoyong.com/SuGeGeDev/XRMServices/2011/Organization.svc/web
Content-Type: text/xml; charset=utf-8
SOAPAction: http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<request i:type="b:GrantAccessRequest" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">
<a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
<a:KeyValuePairOfstringanyType>
<c:key>Target</c:key>
<c:value i:type="a:EntityReference">
<a:Id>fb9a903e-fc3f-e511-80df-00155d1d7b07</a:Id>
<a:LogicalName>account</a:LogicalName>
<a:Name i:nil="true" />
</c:value>
</a:KeyValuePairOfstringanyType>
<a:KeyValuePairOfstringanyType>
<c:key>PrincipalAccess</c:key>
<c:value i:type="b:PrincipalAccess">
<b:AccessMask>ReadAccess</b:AccessMask>
<b:Principal>
<a:Id>cc06819e-9ad3-e411-80bc-00155d09f02e</a:Id>
<a:LogicalName>systemuser</a:LogicalName>
<a:Name i:nil="true" />
</b:Principal>
</c:value>
</a:KeyValuePairOfstringanyType>
</a:Parameters>
<a:RequestId i:nil="true" />
<a:RequestName>GrantAccess</a:RequestName>
</request>
</Execute>
</s:Body>
</s:Envelope>
-------------------------------------------------- HTTP RESPONSE
--------------------------------------------------
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ExecuteResponse xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ExecuteResult i:type="b:GrantAccessResponse" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">
<a:ResponseName>GrantAccess</a:ResponseName>
<a:Results xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
</ExecuteResult>
</ExecuteResponse>
</s:Body>
</s:Envelope>
--------------------------------------------------

可以知道这个文件既记载了请求的消息文本,也记载了返回的消息文本。

然后我去 http://crm2011soap.codeplex.com/ 下载这个工具,包括了源码,我们就不打开和编译了,直接双击打开 bin\Debug 文件夹下面的 CRM2011SoapFormatter.exe 文件,如下图:说明,这个工具不是必须的,只是能帮我们更快的转换前面的请求消息为JavaScript代码,当然你也可以手工进行操作。

这个工具怎么使用,官方有一篇文章:CRM 2011 Jscript Soap Request Formatter RELEASED!!   不过国内不能阅读到,原因你懂的,不懂的话你可能是比较少在中国大陆生活。我这里直接上用法了。

将前面 output.txt 中的请求消息放入到Soap Message的文本框中,其他的字段值根据需要输入,然后点击 Generate 按钮。
我这点击后效果如下,就是Soap Message中的内容变换了,帮你生成代码了。
 
我这里将前面生成的东西稍微改造下,如下:
function ShareAccountReadRightRequest(AccountId,SystemUserId)
{
var requestMain = ""
requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">
";
requestMain += " <s:Body>
";
requestMain += " <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">
";
requestMain += " <request i:type=\"b:GrantAccessRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">
";
requestMain += " <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">
";
requestMain += " <a:KeyValuePairOfstringanyType>
";
requestMain += " <c:key>Target</c:key>";
requestMain += " <c:value i:type=\"a:EntityReference\">
";
requestMain += " <a:Id>
";
requestMain += AccountId;
requestMain += "
</a:Id>";
requestMain += " <a:LogicalName>account</a:LogicalName>";
requestMain += " <a:Name i:nil=\"true\" />";
requestMain += "
</c:value>";
requestMain += "
</a:KeyValuePairOfstringanyType>";
requestMain += " <a:KeyValuePairOfstringanyType>
";
requestMain += " <c:key>PrincipalAccess</c:key>";
requestMain += " <c:value i:type=\"b:PrincipalAccess\">
";
requestMain += " <b:AccessMask>ReadAccess</b:AccessMask>";
requestMain += " <b:Principal>
";
requestMain += " <a:Id>
";
requestMain += SystemUserId;
requestMain += "
</a:Id>";
requestMain += " <a:LogicalName>systemuser</a:LogicalName>";
requestMain += " <a:Name i:nil=\"true\" />";
requestMain += "
</b:Principal>";
requestMain += "
</c:value>";
requestMain += "
</a:KeyValuePairOfstringanyType>";
requestMain += "
</a:Parameters>";
requestMain += " <a:RequestId i:nil=\"true\" />";
requestMain += " <a:RequestName>GrantAccess</a:RequestName>";
requestMain += "
</request>";
requestMain += "
</Execute>";
requestMain += "
</s:Body>";
requestMain += "
</s:Envelope>";
var req = new XMLHttpRequest();
//req.open("POST", Xrm.Page.context.getClientUrl() + "/XRMServices/2011/Organization.svc/web", true);
req.open("POST", GetGlobalContext().getClientUrl() + "/XRMServices/2011/Organization.svc/web", true);
req.setRequestHeader("Accept", "application/xml, text/xml, */*");
req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
req.onreadystatechange = function () { CallSOAPResponse(req); };
req.send(requestMain);
} function CallSOAPResponse(req)
{
if (req.readyState == 4) {
req.onreadystatechange = null; //avoids memory leaks
if (req.status == 200) {
//成功我这里什么都不做
}
else {
Xrm.Utility.alertDialog("共享客户失败。请确保共享给的用户对客户实体至少具有最低级别的读取权限。");
}
}
}

这样就可以方便的在JavaScript中调用了。

 
 

通过JavaScript调用SOAP终结点执行实体消息的更多相关文章

  1. JavaScript 究竟是怎样执行的?

    摘要: 理解 JS 引擎运行原理. 作者:前端小智 原文:搞懂 JavaScript 引擎运行原理 Fundebug经授权转载,版权归原作者所有. 一些名词 JS 引擎 - 一个读取代码并运行的引擎, ...

  2. 翻译-使用Spring调用SOAP Web Service

    原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP ...

  3. 使用IPostBackEventHandler让JavaScript“调用”回传事件

    在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP——实践篇(二)通过自己模拟HTML标签事件与服务器交互,讲了ASP.NET的服务器控件是怎么render成HTML后市怎么“调用”后台方法 ...

  4. [转]Javascript中的自执行函数表达式

    [转]Javascript中的自执行函数表达式 本文转载自:http://www.ghugo.com/javascript-auto-run-function/ 以下是正文: Posted on 20 ...

  5. 深入理解javascript中的立即执行函数(function(){…})()

    投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...

  6. Axis2(10):使用soapmonitor模块监视soap请求与响应消息

    在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与<WebService大讲堂之Axis2(9):编写Axis2模块(Module)>中实现的logging模 ...

  7. javascript 作用域链与执行环境

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 作用域.作用域链.执行环境.执行环境栈以及this的概念在javascript中非常重要,本人经常弄混淆, ...

  8. 怎么样加快JavaScript加载和执行效率

    概览 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...

  9. javascript调用Flash里对象的方法(函数)搞了五个小时。

    搞了几个小时后,才发现,之前走的路是错的. 今天在Firefox浏览器上测试一个javascript调用Flash中的一个对象的方法时遇到问题了, 一搞就整整搞了一个下午. 我记得之前我用Flash8 ...

随机推荐

  1. Openstack中RabbitMQ RPC代码分析

    在Openstack中,RPC调用是通过RabbitMQ进行的. 任何一个RPC调用,都有Client/Server两部分,分别在rpcapi.py和manager.py中实现. 这里以nova-sc ...

  2. jenkins自动化工具使用教程

    自动化构建.测试.部署.代码检测越来越重要.主要有一下几点原因 1.  企业做大,项目变多,多端支持(web,h5,小程序等) 2.  微服务提倡高内聚低耦合,项目因拆分变多 3.  DevOps自动 ...

  3. Javascript高级编程学习笔记(89)—— Canvas(6) 变换

    变换 通过上下文的变化,可以对图像进行处理后再将其绘制到画布上 当我们创建上下文时,会以默认值初始化变化矩阵,在默认的变换矩阵下所有处理都按描述直接绘制. 而当我们为上下文应用变换时,会导致使用不同的 ...

  4. [SQL]LeetCode184. 部门工资最高的员工 | Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  5. IO复用(较详细)

    进程与线程的描述 一个进程至少会创建一个线程,多个线程共享一个程序进程的内存.程序的运行最终是靠线程来完成操作的.线程的数量跟CPU核数有关,一个核最多能发出两个线程.线程的操作主要分为:一:给CPU ...

  6. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  7. redis 系列19 客户端

    一. 概述 Redis服务器是可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复.通过使用I/O多路复用技术实现的文件事 ...

  8. 通过Python、BeautifulSoup爬取Gitee热门开源项目

    一.安装 1.通过requests 对响应内容进行处理,requests.get()方法会返回一个Response对象 pip install requests 2.beautifulSoup对网页解 ...

  9. 如何发起、防御和测试XSS攻击,我们用DVWA来学习(上)

    XSS 全称Cross Site Scripting 即‘跨站脚本攻击’. 从其中文释义我们能直观的知道,这是一种对网站的攻击方式. 其原理在于,使用一切可能手段,将可执行脚本(scripting)植 ...

  10. Spring Cloud Eureka基本概述

    记一次Eureka的进一步学习. 一.Eureka简介 百科描述:Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡 ...