第 2 课:开始对话并传输消息

适用于SQL ServerAzure SQL 托管实例

在本课中,你将学习如何开始对话,完成简单的请求-回复消息周期,然后结束对话。

过程

注意

本文中的代码示例是使用 AdventureWorks2025 示例数据库进行测试的,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

切换到 AdventureWorks2008R2 数据库

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它,将上下文切换到 AdventureWorks2008R2 数据库。

    USE AdventureWorks2008R2;
    GO
    

启动会话并发送请求消息

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以启动对话,并将请求消息发送到 AWDB/1DBSample/TargetService。 必须在一个块中运行代码,因为变量用于将对话句柄从 BEGIN DIALOG 语句传递到 SEND 语句。 批处理运行 BEGIN DIALOG 语句以启动会话。 它生成请求消息,然后使用语句中的 SEND 对话句柄在该会话上发送请求消息。 最后 SELECT 一条语句显示已发送的消息的文本。

    DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RequestMsg AS NVARCHAR (100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
        FROM SERVICE [//AWDB/1DBSample/InitiatorService]
        TO SERVICE N'//AWDB/1DBSample/TargetService'
        ON CONTRACT [//AWDB/1DBSample/SampleContract]
        WITH ENCRYPTION = OFF;
    
    SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION (@InitDlgHandle)
        MESSAGE TYPE [//AWDB/1DBSample/RequestMessage] (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

接收请求并发送答复

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以接收 TargetQueue1DB 答复消息并将其发送回发起程序。 该 RECEIVE 语句检索请求消息。 以下 SELECT 语句显示文本,以便可以验证它是否与上一步发送的消息相同。 该 IF 语句测试收到的消息是否为请求消息类型,以及是否 SEND 使用语句将答复消息发送回发起程序。 该 END CONVERSATION 语句用于结束对话的目标端。 最后 SELECT 一条语句显示答复消息的文本。

    DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg AS NVARCHAR (100);
    DECLARE @RecvReqMsgName AS sysname;
    
    BEGIN TRANSACTION;
    
    WAITFOR (RECEIVE TOP (1) @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name FROM TargetQueue1DB),
    TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage'
        BEGIN
            DECLARE @ReplyMsg AS NVARCHAR (100);
            SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
            SEND ON CONVERSATION (@RecvReqDlgHandle)
                MESSAGE TYPE [//AWDB/1DBSample/ReplyMessage] (@ReplyMsg);
            END CONVERSATION @RecvReqDlgHandle;
        END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

接收答复并结束会话

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以接收回复消息并结束对话。 该 RECEIVE 语句从中 InitiatorQueue1DB检索答复消息。 该 END CONVERSATION 语句结束会话的发起方。 最后 SELECT 一条语句显示答复消息的文本,以便可以确认它与上一步中发送的内容相同。

    DECLARE @RecvReplyMsg AS NVARCHAR (100);
    DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueue1DB),
    TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

后续步骤

你已成功完成 AWDB/1DBSample/InitiatorServiceAWDB/1DBSample/TargetService 之间的请求-回复消息周期。 您可以根据需要多次重复本课中的步骤以传输一对请求-答复消息。 完成调查 SENDREPLY 语句后,可以删除聊天使用的所有对象。