步骤 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 元素创建 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 ”对话框,并按如下所示指定输入值:

    输入 价值
    输入[0] 选择 Amount,Id,Name,(选择 Quantity,ListPrice,PricebookEntry.UnitPrice,PricebookEntry.Name 来自 OpportunityLineItems)来自 Opportunity 当 Name = '
    Input[1] 将源架构中的 Name 元素连接到 functoid,以将 Name 元素的值用作第二个输入。
    Input[2] “注意:对于最后一个输入值,只指定右引号(')。

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

    配置 String Concatenate functoid

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

  4. 将 String Concatenate 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 的名称设置为 QueryRequestMsg 并将 Messages Constructed 属性设置为 QueryRequestMsg

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

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

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

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

  4. 构造查询形状之后,添加一个发送形状。 将形状 SendQueryRequest 命名,并将消息类型设置为 QueryRequestMsg

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

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

    • 将端口名称指定为 SalesforceRESTInterface.

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

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

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

      将端口的 请求操作连接到发送形状(SendQueryRequest),并将端口的 响应操作连接到接收形状(ReceiveQueryResult)。 以下屏幕截图描述了业务流程的一部分,该部分表示将查询请求发送到 Salesforce 并接收响应的过程。

      将查询发送到 Salesforce 并接收响应

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

另请参阅

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