为了账号安全,请及时绑定邮箱和手机立即绑定

作为对话框提示选择的结果发送主动消息

作为对话框提示选择的结果发送主动消息

C#
慕容森 2023-07-09 15:05:59
我对 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);}这段代码不起作用,我不完全确定为什么。(我也很感激任何有关如何解决问题的建议)。我意识到这并没有利用微软提供的示例代码中显示的控制器。老实说,我不明白通知控制器是如何工作的。因此,如果解决方案涉及到这一点,最好能得到一些细节的解释。
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

解决你的问题

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


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


这是因为您没有指定appIdin 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)


主动机器人如何工作

以下是主动示例如何工作的简要说明。我建议下载并使用它以更好地理解。

  1. 机器人在api/messages(所有机器人都执行此操作)和api/notify(只有此机器人执行此操作)上建立侦听器。

  2. 当用户向机器人发送消息时,它会api/messages通过.ActivityHandler

  3. 对于任何消息,机器人都会保存对话参考

  4. 当有人访问时<theBotUrl>/api/notify,它会循环访问每个保存的对话引用,调用ContinueConversation,并将消息发送给保存的对话引用中的所有用户。


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信