创建连接到 Direct Line 应用服务扩展的 .NET 客户端
2023 年 9 月 1 日起,强烈建议使用 Azure 服务标记方法进行网络隔离。 DL-ASE的使用应仅限于高度特定的方案。 在生产环境中实施此解决方案之前,我们建议咨询支持团队,以获取他们的指导。
适用于:SDK v4
本文介绍如何使用 C# 创建连接到 Direct Line 应用服务扩展的 .NET 客户端。 另请参阅此配套文章:为扩展配置 .NET 机器人。
先决条件
- 一个 Azure 帐户。
- 部署到 Azure 门户的机器人。
获取 Direct Line 密钥
- 在浏览器中转到 Azure 门户。
- 在 Azure 门户中,找到 Azure 机器人资源。
- 在设置下选择通道。
- 如果尚未启用,请选择Direct Line通道将其启用。
- 启用 Direct Line 后,从通道中选择它。
- 转到站点部分。 通常会有一个 Default_Site,除非已将其删除或重命名。
- 选择显示链接按钮(眼睛图标)显示其中一个密钥,然后拷贝并保存其值。 将在创建 C# Direct Line 客户端部分使用此值。
注意
此值是 Direct Line 客户端机密,用于连接到 Direct Line 应用服务扩展。 可以根据需要创建其他站点,并且也使用这些机密值。
创建 C# Direct Line 客户端
与 Direct Line 应用服务扩展进行的交互的发生方式不同于传统的 Direct Line,因为大多数通信通过 WebSocket 进行。 更新的 Direct Line 客户端包含的帮助程序类可以用来打开和关闭 WebSocket、通过 WebSocket 发送命令,以及接收从机器人返回的活动。 此部分介绍如何创建一个简单的用来与机器人交互的 C# 客户端。
在 Visual Studio 中,创建新的 .NET Core 控制台应用程序项目。
从 GitHub 存储库克隆 Direct Line 客户端,并将其包含在项目中。
创建客户端并使用机密生成令牌。 此步骤与构建任何其他的 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 的机密值为之前从站点部分 保存的值。
通过生成令牌获得聊天引用以后,即可使用该聊天 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}"); } } } }
现在可以使用会话令牌、
conversationId
以及ReceiveActivities
回调对StreamingConversations
属性打开 WebSocket 了:var client = new DirectLineClient( new Uri(endpoint), new DirectLineClientCredentials(conversation.Token)); await client.StreamingConversations.ConnectAsync( conversation.ConversationId, ReceiveActivities);
现在可以使用客户端来开始聊天并向机器人发送
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(); }