Dynamics CRM 2011编程系列(51):FetchExpression(二)----JavaScript也疯狂

时间:2021-08-22 07:27:38

    本文来探索下在弱客户端下通过FetchExpression来访问Dynamics CRM 2011系统中的数据。在Dynamics CRM 2011系统中客户端居然用FetchExpression来获取系统中的数据,看上去是那么的复古(当前开发人员可以使用系统的REST端点)。但本文仅仅起到一个抛砖引玉的作用,Dynamics CRM 2011 系统存在大量的消息类(API)。通过这些消息类,我们可以完成对系统的各种操作(禁用记录,激活工作流等),详细内容各位看官可以参阅文章《Dynamics CRM 2011 消息类列表》。

 当然啦,如果我们在强客户端(C#,VB.Net)调用这些消息类。微软会为我们提供非常好的开发人员体验,SOAP报文的发送和接收完全被封装,一切都不需要自己干预。但如果我们要在弱客户端上调用这些消息类,那该如何是好呢?元芳你怎么看呢?

各位看官莫慌,莫慌,请参考文章《Dynamics CRM 2011编程系列(50):使用SOAPLogger抓取报文》,在这里我已经给出了解决方案了。

 好吧,现在一切准备都完毕了,让我们动起来吧。

1.运行SOAPLogger抓取报文,在Run方法中输入填入如下代码:

      FetchExpression fetchExp = new FetchExpression(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name='contactid' />
<order attribute='fullname' descending='false' />
</entity>
</fetch>");
slos.RetrieveMultiple(fetchExp);


 

 

2.在output.txt文件中获取截获的SOAP报文。

HTTP REQUEST--------------------------------------------------POST http://msstore-test-02.northamerica.corp.microsoft.com:5550/Example/XRMServices/2011/Organization.svc/webContent-Type: text/xml; charset=utf-8SOAPAction: http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Body>    <RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">      <query i:type="a:FetchExpression" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">        <a:Query><fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>  <entity name='contact'>    <attribute name='fullname' />    <attribute name='contactid' />    <order attribute='fullname' descending='false' />  </entity></fetch></a:Query>      </query>    </RetrieveMultiple>  </s:Body></s:Envelope>--------------------------------------------------

 

3.当前系统中存在的数据

 Dynamics CRM 2011编程系列(51):FetchExpression(二)----JavaScript也疯狂

图1


4.在Contact实体的表单OnLoad事件中编写如下代码(用Ajax向服务器提交SOAP报文)

var queryurl = "http://Server Name/Organization Name/XRMServices/2011/Organization.svc/web";var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");var fetchExp = ['<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">'              , '<s:Body>'              , '<RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">'              , '<query i:type="a:FetchExpression" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">'              , '<a:Query>'              , '<![CDATA['              , '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">'              , '  <entity name="contact">'              , '    <attribute name="fullname" />'              , '    <attribute name="contactid" />'              , '    <order attribute="fullname" descending="false" />'              , '  </entity>'              , '</fetch>'              , ']]>'              , '</a:Query>'              , '</query>'              , '</RetrieveMultiple>'              , '</s:Body>'              , '</s:Envelope>'];xmlhttp.Open("POST", queryurl, false);xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");xmlhttp.setRequestHeader("SOAPAction", " http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple");xmlhttp.Send(fetchExp.join('').toString());  if (xmlhttp.readyState == 4) {     if (xmlhttp.status == 200) {       alert(xmlhttp.responseText);   }    }    else {    }  


5.系统返回如下报文

Dynamics CRM 2011编程系列(51):FetchExpression(二)----JavaScript也疯狂

图2

 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Body>    <RetrieveMultipleResponse xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">      <RetrieveMultipleResult xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">        <a:Entities>          <a:Entity>            <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">              <a:KeyValuePairOfstringanyType>                <b:key>fullname</b:key>                <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Bob Li</b:value>              </a:KeyValuePairOfstringanyType>              <a:KeyValuePairOfstringanyType>                <b:key>contactid</b:key>                <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">441f1166-5c56-e211-af85-00155d1ce818</b:value>              </a:KeyValuePairOfstringanyType>            </a:Attributes>            <a:EntityState i:nil="true" />            <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />            <a:Id>441f1166-5c56-e211-af85-00155d1ce818</a:Id>            <a:LogicalName>contact</a:LogicalName>            <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />          </a:Entity>          <a:Entity>            <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">              <a:KeyValuePairOfstringanyType>                <b:key>fullname</b:key>                <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Clark Wang1</b:value>              </a:KeyValuePairOfstringanyType>              <a:KeyValuePairOfstringanyType>                <b:key>contactid</b:key>                <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">71e70aab-5c56-e211-af85-00155d1ce818</b:value>              </a:KeyValuePairOfstringanyType>            </a:Attributes>            <a:EntityState i:nil="true" />            <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />            <a:Id>71e70aab-5c56-e211-af85-00155d1ce818</a:Id>            <a:LogicalName>contact</a:LogicalName>            <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />          </a:Entity>          <a:Entity>            <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">              <a:KeyValuePairOfstringanyType>                <b:key>fullname</b:key>                <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Hitesh White</b:value>              </a:KeyValuePairOfstringanyType>              <a:KeyValuePairOfstringanyType>                <b:key>contactid</b:key>                <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">87cf252c-7463-e211-9a59-00155d1ce818</b:value>              </a:KeyValuePairOfstringanyType>            </a:Attributes>            <a:EntityState i:nil="true" />            <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />            <a:Id>87cf252c-7463-e211-9a59-00155d1ce818</a:Id>            <a:LogicalName>contact</a:LogicalName>            <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />          </a:Entity>          <a:Entity>            <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">              <a:KeyValuePairOfstringanyType>                <b:key>fullname</b:key>                <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Jim Green</b:value>              </a:KeyValuePairOfstringanyType>              <a:KeyValuePairOfstringanyType>                <b:key>contactid</b:key>                <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">396a665a-5c56-e211-af85-00155d1ce818</b:value>              </a:KeyValuePairOfstringanyType>            </a:Attributes>            <a:EntityState i:nil="true" />            <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />            <a:Id>396a665a-5c56-e211-af85-00155d1ce818</a:Id>            <a:LogicalName>contact</a:LogicalName>            <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />          </a:Entity>        </a:Entities>        <a:EntityName>contact</a:EntityName>        <a:MinActiveRowVersion>-1</a:MinActiveRowVersion>        <a:MoreRecords>false</a:MoreRecords>        <a:PagingCookie><cookie page="1"><fullname last="Jim Green" first="Bob Li" /><contactid last="{396A665A-5C56-E211-AF85-00155D1CE818}" first="{441F1166-5C56-E211-AF85-00155D1CE818}" /></cookie></a:PagingCookie>        <a:TotalRecordCount>-1</a:TotalRecordCount>        <a:TotalRecordCountLimitExceeded>false</a:TotalRecordCountLimitExceeded>      </RetrieveMultipleResult>    </RetrieveMultipleResponse>  </s:Body></s:Envelope>


小结

  1. 在这里我没有处理服务器返回的SOAP报文,但官们可以根据自己的需要来处理它们。
  2. 在Dynamics CRM 2011 系统中,所有的消息类都能通过这样的方式在JavaScript函数中进行调用。
  3. 当然各位看官们可以结合第三方的JavaScript类库来提交SOAP报文。