Microsoft Bot Framework 中:w=11=w:w=10=w
Microsoft Bot Framework V4: System.NullReferenceException: 'Unable to locate SkillConversationIdFactoryBase in HostContext'
我正在创建一个工作流程,允许将作曲家创建的对话框集成到机器人技能项目中。
为了完成这个,我正在尝试按照 post 中的说明进行操作: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
重现问题:
先决条件
重现问题的步骤
打开visual studio中的解决方案文件
Integrate-Composer-Dialog-Using-Skill.sln
在DefaultAdapter.cs
的line 72
上打个断点-这是可以看到错误的地方
开始调试项目
打开机器人模拟器
连接到机器人:http://localhost:3978/api/messages
类型"Greeting"
Bot 应以 "Hello, I have recognized that you said greeting"
响应 - 这意味着作曲家对话框集成正在按预期工作。
类型"Skill"
DefaultAdapter.cs
的 line 72
上的断点应触发给出错误的详细信息。
可以在此处找到错误和堆栈跟踪:https://github.com/silverbulletgt/Integrate-Composer-Dialog-Using-Skill/blob/master/Readme/error%20stack%20trace.txt
编辑:
我能够编译 Bot Builder 代码 Bot Builder GitHub & connect it to my project so that I could debug. I found the error to be happening on line 157
of Microsoft.Bot.Builder.Dialogs.Adaptive.BeginSkill.cs
code BeginSkill.cs。
此行试图从 dialogContext.Context.TurnState
中获取 SkillConversationFactoryBase
。我正在研究如何添加它,以便在执行此代码时填充它。
- 修复:System.NullReferenceException:'Unable to locate SkillConversationIdFactoryBase in HostContext' 在 Microsoft.Bot.Builder.Dialogs.Adaptive.Actions.BeginSkill
此错误是由于缺少依赖项注入要求引起的。
将以下行添加到 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()
- 修复操作返回无效状态代码'NotFound'
发生此异常是因为没有端点 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>());
我测试了一个基本意图,它不使用技能来确定是否会与影响这些的依赖注入有任何冲突。不过,基本意图按预期工作。
我用更改更新了 master 分支 Project Repo
我正在创建一个工作流程,允许将作曲家创建的对话框集成到机器人技能项目中。
为了完成这个,我正在尝试按照 post 中的说明进行操作: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
重现问题:
先决条件
重现问题的步骤
打开visual studio中的解决方案文件
Integrate-Composer-Dialog-Using-Skill.sln
在
DefaultAdapter.cs
的line 72
上打个断点-这是可以看到错误的地方开始调试项目
打开机器人模拟器
连接到机器人:http://localhost:3978/api/messages
类型
"Greeting"
Bot 应以
"Hello, I have recognized that you said greeting"
响应 - 这意味着作曲家对话框集成正在按预期工作。类型
"Skill"
DefaultAdapter.cs
的line 72
上的断点应触发给出错误的详细信息。
可以在此处找到错误和堆栈跟踪:https://github.com/silverbulletgt/Integrate-Composer-Dialog-Using-Skill/blob/master/Readme/error%20stack%20trace.txt
编辑:
我能够编译 Bot Builder 代码 Bot Builder GitHub & connect it to my project so that I could debug. I found the error to be happening on line 157
of Microsoft.Bot.Builder.Dialogs.Adaptive.BeginSkill.cs
code BeginSkill.cs。
此行试图从 dialogContext.Context.TurnState
中获取 SkillConversationFactoryBase
。我正在研究如何添加它,以便在执行此代码时填充它。
- 修复:System.NullReferenceException:'Unable to locate SkillConversationIdFactoryBase in HostContext' 在 Microsoft.Bot.Builder.Dialogs.Adaptive.Actions.BeginSkill
此错误是由于缺少依赖项注入要求引起的。 将以下行添加到 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()
- 修复操作返回无效状态代码'NotFound' 发生此异常是因为没有端点 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>());
我测试了一个基本意图,它不使用技能来确定是否会与影响这些的依赖注入有任何冲突。不过,基本意图按预期工作。
我用更改更新了 master 分支 Project Repo