【问题标题】:Multiple Conversations For Direct Line Client直线客户的多次对话
【发布时间】:2019-12-28 06:45:09
【问题描述】:

我正在尝试使用 Microsoft.Bot.Connector.DirectLine .NET 客户端连接到我的 Direct Line Channel。我的客户端应用程序将同时打开许多对话(例如 1000 多个)。

我正在尝试做的是有效地创建一个 Direct Line 客户端对象,该对象可以接收我所有对话的消息,并且每个对话没有一个客户端。

以下代码来自: https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-directline-extension-net-client?view=azure-bot-service-4.0

问题在于,要创建一个新对话,我需要创建一个新客户端,我认为这最终会耗尽大量套接字。有谁知道我是否可以创建一个连接然后监听多个对话?

谢谢

static async Task Main(string[] args)
{
    Console.WriteLine("What is your name:");
    var UserName = Console.ReadLine();

    var tokenClient = new DirectLineClient(
            new Uri(endpoint),
            new DirectLineClientCredentials(secret));

    var conversation = await tokenClient.Tokens.GenerateTokenForNewConversationAsync();

    var client = new DirectLineClient(
            new Uri(endpoint),
            new DirectLineClientCredentials(conversation.Token));

    await client.StreamingConversations.ConnectAsync(
        conversation.ConversationId,
        ReceiveActivities);

    var startConversation = await client.StreamingConversations.StartConversationAsync();
    var from = new ChannelAccount() { Id = startConversation.ConversationId, Name = UserName };
    var message = Console.ReadLine();

    while (message != "end")
    {
        try
        {
            var response = await client.StreamingConversations.PostActivityAsync(
                startConversation.ConversationId,
                new Activity()
                {
                    Type = "message",
                    Text = message,
                    From = from,
                    ChannelData = new Common.ChannelData() { FromNumber = "+17081234567"}
                });
        }
        catch (OperationException ex)
        {
            Console.WriteLine(
                $"OperationException when calling PostActivityAsync: ({ex.StatusCode})");
        }
        message = Console.ReadLine();
    }

    Console.ReadLine();
}

public static void ReceiveActivities(ActivitySet activitySet)
{
    if (activitySet != null)
    {
        foreach (var a in activitySet.Activities)
        {
            if (a.Type == ActivityTypes.Message && a.From.Id == "MyBotName")
            {
                Console.WriteLine($"<Bot>: {a.Text}");
            }
        }
    }
}

【问题讨论】:

  • 这将有助于更多地了解您的 Direct Line 客户的目的。当您说您将同时打开 1000 多个对话时,您是指与 1000 多个人的对话吗?拥有 1000 多个机器人?一个机器人有 1000 多个实例?您的客户是否打算参与所有这些对话?如果您只是想监控对话,那么我想您将不需要 websockets 启用的双向通信。我可以在this document 中看到,还有其他方式可以连接 Direct Line。
  • 你还在做这个吗?
  • 抱歉,是的 - 基本上我要做的是重新创建 Twilio SMS 通道,以便我们可以有多个传入和传出电话号码。 (每位客户 1 个)。所以基本上我的替代 Twilio 频道将使用 Direct Line API 开始对话,然后向机器人发送包含 SMS 文本的活动,然后等待它响应。因此,这个 Twilio 替代通道可能会同时为每个对话打开许多不同的 Websocket 客户端。有什么建议?谢谢。
  • 我的理解是web sockets主要用于建立服务器和客户端之间的连接。如果您想制作自己的频道,那么听起来您想在服务器中使用 Direct Line。您正在尝试创建一个在 SMS 和机器人之间传输消息的 Web 服务。您不想使用 Direct Line 创建像 Web Chat 这样的聊天客户端,因为用户已经在他们的手机上使用文本消息系统。对吗?
  • 您还需要帮助吗?

标签: c# client botframework azure-bot-service direct-line-botframework


【解决方案1】:

我认为使用 Direct Line 流式传输扩展程序对您的目的而言会存在问题。我猜您的自定义 SMS 频道本身就是一项应用服务。由于可以(在您的情况下可能应该)扩展应用服务以使多个实例同时运行,因此假设来自同一对话的两条 SMS 消息发送到您的频道的两个实例。除了让您的频道的每个实例使用许多 Web 套接字与许多机器人对话之外,您的频道的多个实例可能使用重复的 Web 套接字与同一个机器人对话。还有一个问题是每个机器人本身都需要支持流扩展。

您可以考虑使用traditional Direct Line,而不是使用 Direct Line 流式处理扩展。这将涉及通过轮询 Direct Line 端点从机器人接收活动。

由于 Direct Line 本身就是一个您要在自己的频道之上使用的频道,因此您也可以考虑完全取消 Direct Line。这样你就不会在用户和机器人之间有两个通道。您可以直接向每个机器人的端点发送 HTTP 请求,机器人将接收的活动将包含您频道的服务 URL,从而允许您的频道接收来自机器人的消息。

【讨论】:

  • 感谢凯尔的所有帮助。我认为使用 Direct Line 和传统的 HTTP GET / POST 方法将遇到的一个问题是我将不得不反复快速地轮询大量对话以检查是否有任何响应。除非我能以某种方式获得一批所有的对话,否则它有它自己的问题,比如使用套接字。是否有任何文档可以将活动直接发布到我的机器人,如您所提到的那样消除直线?谢谢。
  • @Ryan - 请理解创建频道是一个需要大量专业知识的高级主题。您可以提出更多问题,但您必须自己做很多工作才能弄清楚这一点。您知道您的机器人的端点是什么,因为您必须将该端点输入到您的机器人通道注册中。当您向该端点发送消息时,您应该以机器人可以验证的某种方式对它们进行身份验证,这样人们就无法冒充您的频道。例如,Bot Framework 使用 Microsoft 应用凭据和令牌服务器来验证消息。
  • 机器人只是一个 Web 应用程序,因此您可以咨询ASP.NET Core documentation,了解有关向 Web 应用程序发送 HTTP 请求的信息。如果您想在发送消息时使用 Bot Framework 的活动模式,那么Bot Framework documentation 中有大量相关信息。将活动直接发送到机器人与将其发送到 Direct Line 没有太大区别。
  • 完美,谢谢凯尔,是的,我大体上明白需要做什么,我没想过直接跳过直线直接去找机器人。还有另一个论坛帖子建议使用直接线路,但正如您所指出的,我首先发布此内容的原因是它有一些额外的挑战。我计划使用 Azure AD 的身份验证。再次感谢您的帮助!
  • 很高兴能帮上忙。请记住接受这个答案。
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多