【问题标题】:Teams bot Activity.CreateReply throwing NullReferenceException团队机器人 Activity.CreateReply 抛出 NullReferenceException
【发布时间】:2017-06-27 16:13:30
【问题描述】:

我正在为 Microsoft Teams 开发机器人。我正在使用自定义机器人功能。我让机器人作为侧载包工作,但由于网络的限制,我需要将机器人保留在内部并使用自定义机器人功能。我目前正在通过使用 ngrok 隧道连接到我的本地主机来对其进行测试。

我现在在尝试创建回复时遇到了问题。每当我这样称呼时:

var reply = activity.CreateReply(message.ReadToEnd());

我得到一个 NullReferenceException 说“对象引用未设置为对象的实例”。 message 是一个打开的 .txt 文件。每次调用 activity.CreateReply() 时都会出现此错误。我不明白的部分是 Bot Framework Emulator 中的一切都按预期工作,并且当 bot 是侧面加载的包时,而不是当 bot 是自定义 bot 时。

这是我的完整 Post 方法:

    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

        if (activity.Type == ActivityTypes.Message)
        {
            // Commands:
            // Retrieve TFS Work Item(s)
            if (new Regex(@"\but\s?\d{5}\b").IsMatch(activity.Text.ToLower()))
            {
                var reply = new RetrieveWorkItem();
                await connector.Conversations.ReplyToActivityAsync(reply.Response(activity));
            }
            // Help
            else if (activity.Text.ToLower().Contains("help"))
            {
                var message = File.OpenText($"{System.AppDomain.CurrentDomain.BaseDirectory}/Messages/HelpMessage.txt");
                var reply = activity.CreateReply(message.ReadToEnd());
                await connector.Conversations.ReplyToActivityAsync(reply);
            }
            // Not Recognized
            else
            {
                var reply = activity.CreateReply("Command not recognized. Type \"@Keller Bot Help\" for a list of commands.");
                await connector.Conversations.ReplyToActivityAsync(reply);
            }
        }
        else
        {
            HandleSystemMessage(activity, connector);
        }

        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

这是机器人发送的完整错误和 StackTrace:https://pastebin.com/ZSrjrA9z

【问题讨论】:

  • 您确定文件打开正常吗?
  • 是的,问题不在于文件,因为当机器人被侧载或使用完全相同的回调 URL 从模拟器运行时,它打开得很好。我并不是要对消息引起太多关注,因为我所有的 activity.CreateReply() 调用都会引发相同的异常,包括 // Not Recognized 下的异常,它接受一个简单的字符串。
  • 有人能重现这个吗?我试过了,我不能
  • 你的reply对象有什么?
  • 它要么是只包含一个字符串的消息,要么是带有一些缩略图卡的消息。都不行。

标签: c# botframework microsoft-teams


【解决方案1】:

您说您是按照here 的说明将其实现为自定义机器人。问题在于,您似乎正在使用 Bot Framework 消息传递调用(例如 CreateReply()),这将不起作用,因为当您通过自定义机器人进程时,您没有处理已注册的 BF 机器人。

相反,您可以创建一个新的 Activity() 并将其返回以响应 HttpPost 请求。

我们确实有一个sample,如果有帮助,您可以查看。

【讨论】:

  • 行得通,谢谢。关于自定义机器人的局限性,我还有一个问题。文档说自定义机器人不能利用诸如“imBack”和“invoke”之类的按钮操作。这是否意味着按钮除了打开一个 URL 之外不能做任何事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2019-01-10
相关资源
最近更新 更多