创建连接到 Direct Line 应用服务扩展的 .NET 客户端

2023 年 9 月 1 日起,强烈建议使用 Azure 服务标记方法进行网络隔离。 DL-ASE的使用应仅限于高度特定的方案。 在生产环境中实施此解决方案之前,我们建议咨询支持团队,以获取他们的指导。

适用于:SDK v4

本文介绍如何使用 C# 创建连接到 Direct Line 应用服务扩展的 .NET 客户端。 另请参阅此配套文章:为扩展配置 .NET 机器人

先决条件

  • 一个 Azure 帐户。
  • 部署到 Azure 门户的机器人。

获取 Direct Line 密钥

  1. 在浏览器中转到 Azure 门户
  2. 在 Azure 门户中,找到 Azure 机器人资源。
  3. 设置下选择通道
  4. 如果尚未启用,请选择Direct Line通道将其启用。
  5. 启用 Direct Line 后,从通道中选择它。
  6. 转到站点部分。 通常会有一个 Default_Site,除非已将其删除或重命名。
  7. 选择显示链接按钮(眼睛图标)显示其中一个密钥,然后拷贝并保存其值。 将在创建 C# Direct Line 客户端部分使用此值。

注意

此值是 Direct Line 客户端机密,用于连接到 Direct Line 应用服务扩展。 可以根据需要创建其他站点,并且也使用这些机密值。

创建 C# Direct Line 客户端

与 Direct Line 应用服务扩展进行的交互的发生方式不同于传统的 Direct Line,因为大多数通信通过 WebSocket 进行。 更新的 Direct Line 客户端包含的帮助程序类可以用来打开和关闭 WebSocket、通过 WebSocket 发送命令,以及接收从机器人返回的活动。 此部分介绍如何创建一个简单的用来与机器人交互的 C# 客户端。

  1. 在 Visual Studio 中,创建新的 .NET Core 控制台应用程序项目。

  2. 从 GitHub 存储库克隆 Direct Line 客户端,并将其包含在项目中。

  3. 创建客户端并使用机密生成令牌。 此步骤与构建任何其他的 C# Direct Line 客户端的步骤相同,只是需要用在机器人中的终结点会追加 .bot/ 路径,如下所示。 请勿忘记结尾的 /

    string endpoint = "https://<your_bot_name>.chinacloudsites.cn/.bot/";
    string secret = "<your_bot_direct_line_secret_key>";
    
    var tokenClient = new DirectLineClient(
        new Uri(endpoint),
        new DirectLineClientCredentials(secret));
    var conversation = await tokenClient.Tokens.GenerateTokenForNewConversationAsync();
    

    请注意以下内容:

    • 终结点值是在将机器人部署到 Azure 时获得的机器人 URL。 有关详细信息,请参阅为扩展配置 .NET 机器人
    • 显示为 YOUR_BOT_SECRET 的机密值为之前从站点部分 保存的值。
  4. 通过生成令牌获得聊天引用以后,即可使用该聊天 ID 打开一个在 DirectLineClient 上有新 StreamingConversations 属性的 WebSocket。 为此,你需要创建一个回调。当机器人需要向客户端发送 ActivitySets 时,就会调用该回调。

    public static void ReceiveActivities(ActivitySet activitySet)
    {
        if (activitySet != null)
        {
            foreach (var a in activitySet.Activities)
            {
                if (a.Type == ActivityTypes.Message && a.From.Id.Contains("bot"))
                {
                    Console.WriteLine($"<Bot>: {a.Text}");
                }
            }
        }
    }
    
  5. 现在可以使用会话令牌、conversationId 以及 ReceiveActivities 回调对 StreamingConversations 属性打开 WebSocket 了:

    var client = new DirectLineClient(
        new Uri(endpoint),
        new DirectLineClientCredentials(conversation.Token));
    
    await client.StreamingConversations.ConnectAsync(
        conversation.ConversationId,
        ReceiveActivities);
    
  6. 现在可以使用客户端来开始聊天并向机器人发送 Activities

    
    var startConversation = await client.StreamingConversations.StartConversationAsync();
    var from = new ChannelAccount() { Id = "123", Name = "Fred" };
    var message = Console.ReadLine();
    
    while (message != "end")
    {
        try
        {
            var response = await client.StreamingConversations.PostActivityAsync(
                startConversation.ConversationId,
                new Activity()
                {
                    Type = "message",
                    Text = message,
                    From = from
                });
        }
        catch (OperationException ex)
        {
            Console.WriteLine(
                $"OperationException when calling PostActivityAsync: ({ex.StatusCode})");
        }
        message = Console.ReadLine();
    }