根据对话框提示选择发送主动消息

时间:2019-07-20 00:30:15

标签: c# botframework

我是Microsoft Bot Framework的新手。我有一个机器人,可以接收来自一个用户的消息,并且可以被另一个用户查看。我想添加一个功能,使查看者可以随后回复发件人。我认为最好的方法是向原始发件人发送主动消息。但是,我很难理解Microsoft提供的文档,而其他来源的文档都过时了。

现在这就是我所拥有的。

  

MessageDetails.RelatesTo包含ConversationReference:

private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var messageDetails = (MessageDetails)stepContext.Options;



    var replyText = (string)stepContext.Result;

    var messageactivity = messageDetails.RelatesTo.GetContinuationActivity();

    await stepContext.Context.SendActivityAsync($"{messageDetails.RelatesTo}");

    var client = new ConnectorClient(new Uri(messageactivity.ServiceUrl));
    if (messageDetails.IsTrustedServiceUrl)
    {
        MicrosoftAppCredentials.TrustServiceUrl(messageactivity.ServiceUrl);
    }



    var triggerReply = messageactivity.CreateReply();
    triggerReply.Text = $"NoReply from {stepContext.Context.Activity.Name}: {replyText}";

    await client.Conversations.ReplyToActivityAsync(triggerReply);

    await stepContext.Context.SendActivityAsync($"Your reply has been sent to {messageDetails.RelatesTo.User.Name}.");

    return await stepContext.EndDialogAsync(messageDetails, cancellationToken);
}

此代码不起作用,我不确定为什么。 (对于任何有关如何解决问题的建议,我也将不胜感激)。我意识到这没有利用Microsoft提供的示例代码中显示的控制器。老实说,我不知道通知控制器是如何工作的。因此,如果解决方案涉及这一点,那么对一些细节进行解释将是很棒的。

1 个答案:

答案 0 :(得分:0)

解决问题

我的猜测是您收到此错误:

  

System.ArgumentNullException:'值不能为null。参数名称:clientId'

这是因为您没有在appId中指定new ConnectorClient。您可以忽略它,因为最好做一些类似的事情:

await stepContext.Context.Adapter.ContinueConversationAsync("<yourAppId>", messageDetails.RelatesTo, async (ITurnContext turnContext, CancellationToken cancel) =>
{
    await turnContext.SendActivityAsync(triggerReply);
}, cancellationToken);

关键是要确保您有一个ConversationReference用户,您需要将主动消息发送给该用户。如果您没有,则应该可以CreateConversation建立一个

请注意,您还有:

if (messageDetails.IsTrustedServiceUrl)
{
    MicrosoftAppCredentials.TrustServiceUrl(messageactivity.ServiceUrl);
}

这基本上是在说:“如果我们已经信任serviceUrl,请再次信任它”。相反,您需要:if (!messageDetails.IsTrustedServiceUrl)


Proactive Bot的工作方式

这里是对主动样本的工作方式的简要说明。我建议下载并尝试使用它以获得更好的理解。

  1. 该漫游器在api/messages(所有漫游器都这样做)和api/notify(仅该漫游器这样做)上建立侦听器。
  2. 当用户向漫游器发送消息时,它会通过is processed进入api/messagesActivityHandler
  3. 关于任何消息,机器人saves the conversation reference
  4. 当某人访问<theBotUrl>/api/notify时,loops through each saved conversation referencecalls ContinueConversationsends the message会访问已保存的会话引用中的所有用户