步骤 3b:使用 WCF-WebHttp 适配器从 Salesforce 检索机会详细信息

在本部分中,我们将改进业务流程,以处理传入的机会通知,从通知中提取机会名称,并使用该名称创建请求查询,以发送到 Salesforce。 此请求检索与机会关联的产品的特定详细信息。 Salesforce 的查询响应将接收回BizTalk Server。 为此,我们将执行以下步骤:

  • 创建用于向 Salesforce 发送查询消息的架构和消息变量。

  • 创建映射,以使用机会通知中的值创建查询,来检索与机会关联的产品详细信息。

  • 创建用于从 Salesforce 接收查询响应的架构。

  • 为请求和响应架构创建消息变量。

创建用于向 Salesforce 发送查询消息的架构和消息变量

若要使用通过机会通知提供的信息从 Salesforce 检索产品详细信息,我们需要向 Salesforce 发送查询。 查询将作为一条 XML 消息发送到 Salesforce。 因此,在下面的过程中,我们将创建请求消息架构。 在随后的过程中,我们会将机会通知架构与此架构相映射,以构造用于检索机会的产品详细信息的查询。

创建用于发送查询请求的架构

  1. 将新架构添加到BizTalk Server项目。 将它命名为 QueryRequest.xsd

  2. 将根节点重命名为 QueryRequest。 在 QueryRequest 记录下添加一个子字段元素,并将其命名为 Query

  3. 提升架构中的 Query 元素,使其可在业务流程中使用。 在后面的步骤中,我们将使用此已升级的元素分配查询字符串。

    右键单击 Query 元素,指向“ 提升”,然后单击“ 快速升级”。 这将导致使用 Query 元素创建 PropertySchema.xsd 架构。 请记下 PropertySchema 的命名空间。 在 BizTalk Server 管理控制台中配置物理端口时,你将在以后的步骤中用到此端口。

  4. 保存所有更改。

将机会通知架构映射到查询架构

若要检索与机会关联的产品详细信息,我们需要向 Salesforce 发送如下查询:

SELECT Amount, Id, Name,(SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) FROM Opportunity Where Name = '<opportunity_name>'

在前面的过程中,我们已创建了查询消息架构。 在此过程中,我们将机会通知架构映射到查询请求架构,并使用 functoid 构造此查询。 此查询将作为值传递给 QueryRequest.xsd 架构中的 Query 元素。

映射机会通知

  1. 将映射添加到BizTalk Server项目。 将映射 Notification_QueryRequest.btm命名为 。

  2. 将源架构设置为 NotificationService_soap_sforce_com_2005_09_outbound.xsd。 将目标架构设置为 QueryRequest.xsd

  3. 字符串串联 functoid 添加到映射图面。 打开 “配置字符串连接 Functoid ”对话框并指定输入值,如下所示:

    输入
    Input[0] SELECT Amount, Id, Name,(SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) FROM Opportunity Where Name = '
    Input[1] 将源架构中的 Name 元素连接到 functoid,以使用 Name 元素的值作为第二个输入。
    Input[2] ' 注意: 对于最后一个输入值,请仅指定右引号 (') 。

    以下屏幕截图描述了 String Concatenate functoid 的配置。

    配置字符串串联 functoid

    当三个输入参数连接在一起时,将形成要发送到 Salesforce 的所需查询。

  4. 将“字符串连接”functoid 连接到目标架构中的 Query 元素,如下面的屏幕快照中所示。

    将通知响应映射到查询架构

  5. 保存对映射所做的更改。

创建用于接收查询响应消息的架构

在本部分中,我们将创建用于从 Salesforce 接收查询响应消息的架构。 在本部分中,我们将手动创建查询响应架构。

创建用于接收查询响应的架构

  1. 将新架构添加到BizTalk Server项目,并将其命名为 QueryResult.xsd

  2. Salesforce QueryResult 对象描述从 Salesforce 收到的查询响应。 因此,我们将构建一个描述以下内容的架构:

    <?xml version="1.0" encoding="utf-16" ?>
    - <xs:schema xmlns="http://BtsSalesforceIntegration.QueryResult" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://BtsSalesforceIntegration.QueryResult" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      - <xs:element name="QueryResult">
        - <xs:complexType>
          - <xs:sequence>
            <xs:element name="done" type="xs:string" />
            - <xs:sequence>
              - <xs:element name="records">
                - <xs:complexType>
                  - <xs:sequence>
                    <xs:element name="Id" type="xs:string" />
                    <xs:element name="Amount" type="xs:string" />
                    <xs:element name="Name" type="xs:string" />
                    - <xs:sequence>
                      - <xs:element name="OpportunityLineItems">
                        - <xs:complexType>
                          - <xs:sequence>
                            <xs:element name="done" type="xs:string" />
                            - <xs:sequence minOccurs="1" maxOccurs="unbounded">
                              - <xs:element name="records">
                                - <xs:complexType>
                                  - <xs:sequence>
                                    <xs:element name="Quantity" type="xs:string" />
                                    <xs:element name="ListPrice" type="xs:string" />
                                    - <xs:element name="PricebookEntry">
                                      - <xs:complexType>
                                        - <xs:sequence>
                                          <xs:element name="UnitPrice" type="xs:string" />
                                          <xs:element name="Name" type="xs:string" />
                                        </xs:sequence>
                                        <xs:attribute name="type" type="xs:string" />
                                        <xs:attribute name="url" type="xs:string" />
                                      </xs:complexType>
                                    </xs:element>
                                  </xs:sequence>
                                  <xs:attribute name="type" type="xs:string" />
                                  <xs:attribute name="url" type="xs:string" />
                                </xs:complexType>
                              </xs:element>
                            </xs:sequence>
                            <xs:element name="totalSize" type="xs:string" />
                          </xs:sequence>
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                  </xs:sequence>
                  <xs:attribute name="type" type="xs:string" />
                  <xs:attribute name="url" type="xs:string" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:element name="totalSize" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    架构结构应如下所示:

    来自 Salesforce BTS_SF_QueryResult的查询响应的架构

  3. 保存对架构所做的更改。

为 QueryRequest 和 QueryResult 架构创建消息变量

在创建 QueryRequest 和 QueryResult 架构后,你必须在业务流程中创建两个消息变量来表示这两种消息类型。

创建消息变量

  1. 打开 NotificationService.odx 业务流程,在业务流程视图中添加两条新消息。 将消息名称设置为 QueryRequestMsgQueryResultMsg

  2. QueryRequestMsg 的消息类型设置为 BtsSalesforceIntegration.QueryRequest

  3. QueryResultMsg 的消息类型设置为 BtsSalesforceIntegration.QueryResult

  4. 保存对业务流程所做的更改。

更新业务流程以将消息发送到 Salesforce 并接收响应

在主题步骤 3a:将 Salesforce 商机通知接收到 BizTalk Server 中,我们构建了从 Salesforce 接收商机通知并发送确认的业务流程。 在此步骤中,我们将在此业务流程的基础上构建,以将查询请求发送到 Salesforce 来获得与机会相关的产品详细信息并接收响应。 我们已创建了将在此步骤中使用的架构(QueryRequest.xsd 和 QueryResult.xsd)和消息变量(QueryRequestMsg 和 QueryResultMsg)。

向 Salesforce 发送查询请求和接收响应

  1. SendNotificationAck 形状后面添加构造消息形状。 将形状的名称设置为 ConstructQuery ,并将 Messages Constructed 属性设置为 QueryRequestMsg

  2. ConstructQuery 形状中,添加 转换 形状。 双击“转换”形状以打开“转换配置”对话框。 在对话框中,选择“ 现有地图 ”选项,然后从下拉列表中选择 “BtsSalesforceIntegration.Notification_QueryRequest”。 将 “源” 设置为 “NotificaitonMessage”,将 “目标 ”设置为 “QueryRequestMsg”,然后单击“ 确定”。

  3. “ConstructQuery” 形状中,在“转换”形状之后,添加“消息分配”形状。 双击“消息赋值”形状并添加以下表达式:

    QueryRequestMsg(BtsSalesforceIntegration.PropertySchema.Query) = QueryRequestMsg.Query;
    

    通过执行此操作,我们将 QueryRequestMsg 架构中 Query 元素的值传递给属性架构中的提升元素 Query。 配置 WCF-WebHttp 端口时,我们将使用此元素将查询值动态传递到请求消息。

  4. “ConstructQuery” 形状之后,添加“发送”形状。 将形状 SendQueryRequest 命名为 ,并将消息类型设置为 QueryRequestMsg

  5. 在“发送”形状之后,添加“接收”形状并将其命名为 ReceiveQueryResult。 将形状的消息类型设置为 QueryResultMsg

  6. 添加端口以向 Salesforce 发送查询请求,并接收作为响应的查询结果。 在“端口配置”向导中,选择以下选项:

    • 将端口名称指定为 SalesforceRESTInterface

    • 选择用于创建新的端口类型的选项。

    • “通信模式 ”设置为 “请求-响应”。

    • “通信的端口方向 ”设置为 “我将发送请求并接收响应 ”,并将 “端口绑定 ”设置为 “稍后指定”。

      将端口的请求操作连接到发送形状 (SendQueryRequest) 并将端口的响应操作连接到 Receive 形状 (ReceiveQueryResult) 。 下面的屏幕快照描述了业务流程的一部分,它表示向 Salesforce 发送查询请求并接收响应的流程。

      向 Salesforce 发送查询并接收响应

    在本主题中,我们更新了业务流程以向 Salesforce 发送查询请求,并接收与 Salesforce 中创建的机会有关的详细信息(如产品、数量等)。 在随后的主题中,我们将更新此解决方案,以将 Salesforce 响应输入到本地的 SQL Server 数据库。

另请参阅

步骤 3:在 Visual Studio 中创建 BizTalk Server 解决方案