【问题标题】:Microsoft Bot Framework V4: System.NullReferenceException: 'Unable to locate SkillConversationIdFactoryBase in HostContext'Microsoft Bot Framework V4:System.NullReferenceException:'无法在 HostContext 中找到 SkillConversationIdFactoryBase'
【发布时间】:2021-03-27 15:42:40
【问题描述】:

我正在创建一个工作流,允许将 composer 创建的对话框集成到机器人技能项目中。

为了做到这一点,我正在尝试按照这篇文章中的说明进行操作:https://microsoft.github.io/botframework-solutions/skills/handbook/experimental-add-composer/

我的作曲家创建了包括调用技能的对话框。当我通过 Bot Emulator 启动该意图时,我收到此错误:

System.NullReferenceException: 'Unable to locate SkillConversationIdFactoryBase in HostContext'

解决此错误的设置非常耗时,因此我创建了一个 git 存储库,可以很容易地启动它来演示该问题。

该项目可以在这里找到: https://github.com/silverbulletgt/Integrate-Composer-Dialog-Using-Skill

重现问题:

先决条件

重现问题的步骤

  1. 在 Visual Studio 中打开解决方案文件 Integrate-Composer-Dialog-Using-Skill.sln

  2. DefaultAdapter.csline 72 上放置一个断点 - 这是可以看到错误的地方

  3. 开始调试项目

  4. 打开机器人模拟器

  5. 连接机器人:http://localhost:3978/api/messages

  6. 输入"Greeting"

  7. Bot 应该以 "Hello, I have recognized that you said greeting" 响应 - 这意味着 Composer 对话框集成正在按预期工作。

  8. 输入"Skill"

  9. DefaultAdapter.csline 72 上的断点应该触发提供错误的详细信息。

可以在这里找到错误和堆栈跟踪:https://github.com/silverbulletgt/Integrate-Composer-Dialog-Using-Skill/blob/master/Readme/error%20stack%20trace.txt

编辑:

我能够编译 Bot Builder 代码 Bot Builder GitHub 并将其连接到我的项目,以便我可以调试。我发现错误发生在 line 157Microsoft.Bot.Builder.Dialogs.Adaptive.BeginSkill.cs 代码 BeginSkill.cs 上。

此行试图将SkillConversationFactoryBasedialogContext.Context.TurnState 中取出。我正在研究如何添加它,以便在执行此代码时填充它。

【问题讨论】:

标签: c# botframework


【解决方案1】:
  1. 修复:System.NullReferenceException:Microsoft.Bot.Builder.Dialogs.Adaptive.Actions.BeginSkill 中的“无法在 HostContext 中找到 SkillConversationIdFactoryBase”

此错误是由于缺少依赖注入要求引起的。 将以下行添加到 Startup.cs

services.AddSingleton<SkillConversationIdFactoryBase, SkillConversationIdFactory>();
services.AddSingleton<HttpClient>(new HttpClient());
services.AddSingleton<BotFrameworkClient, BotFrameworkHttpClient>();

添加到 DefaultAdapter.cs

新字段

private readonly SkillConversationIdFactoryBase _skillConversationIdFactoryBase;

新的构造函数参数

SkillConversationIdFactoryBase skillConversationIdFactoryBase,
BotFrameworkClient botFrameworkClient

到构造函数的主体

_skillConversationIdFactoryBase = skillConversationIdFactoryBase;

Use(new RegisterClassMiddleware<SkillConversationIdFactoryBase>(_skillConversationIdFactoryBase));
Use(new RegisterClassMiddleware<BotFrameworkClient>(botFrameworkClient));

这修复了最初的异常,但是在调用技能时出现了新的异常。

异常 wasOperation 返回了无效的状态代码“NotFound” 在 Microsoft.Bot.Connector.Conversations.d__10.MoveNext()

  1. 修复操作返回无效状态代码“未找到” 发生此异常是因为没有 endpiont api/skills。我想 Bot Composer 会以某种方式自动添加此端点。

我根据此处的示例添加了 SkillController.cs:Bot Builder Tests JSON SkillController

然后添加依赖注入来支持控制器。 添加到 Startup.cs

services.AddSingleton<ChannelServiceHandler, SkillHandler>();
            services.AddSingleton<BotAdapter>(sp => (BotFrameworkHttpAdapter)sp.GetService<IBotFrameworkHttpAdapter>());

我测试了一个基本意图,它不使用技能来确定是否会与影响这些的依赖注入发生任何冲突。不过,基本意图按预期工作。

我更新了主分支 Project Repo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2020-04-13
    • 2017-04-10
    相关资源
    最近更新 更多