Bot Framework 3.x中Context.Wait注册失效问题及解决方法
解决Bot Framework 3.x中
context.Wait()后指定函数不触发的问题 我之前帮同事排查过几乎一模一样的问题,你的情况确实是对话类里的实例模型变量没加[Serializable]特性导致的!
问题场景复盘
你提到的流程:MessageReceived → HandleMessage → HandleMessageWhenMoreThanOneAnswer(在这里调用context.Wait(MyFunction)),之后用户发消息完全没触发MyFunction,你怀疑对话被销毁或者Wait没注册成功——这个猜测方向其实很准,但根源藏在你的自定义模型上。
问题核心原因
Bot Framework 3.x的对话状态(包括你通过context.Wait()注册的回调函数)是靠序列化持久化的。如果你的对话类里有作为实例变量的自定义模型,而这个模型没有标记[Serializable]特性,框架在尝试序列化对话状态时会静默失败(不会直接抛异常,这也是为啥排查起来挠头),直接导致整个对话状态丢失——相当于你注册的Wait回调根本没被存下来,用户后续发消息时,框架找不到对应的回调逻辑,自然不会触发你指定的MyFunction。
快速修复步骤
- 找到你对话类中那个作为实例变量的自定义模型类
- 在类定义上方加上
[Serializable]特性,示例代码:
[Serializable] public class MyCustomDialogModel { // 你的模型属性、方法等内容 }
- 顺便确认下你的对话类本身也标记了
[Serializable](一般QnAMakerDialog继承的类已经处理了,但保险起见检查下)
额外提醒
这种问题很容易被忽略,因为序列化失败不会在控制台或者日志里直接报明显错误,只会表现为对话状态“莫名丢失”,回调不触发。以后在Bot Framework 3.x里写对话类时,只要用到自定义实例对象,一定要记得加[Serializable]特性!
内容的提问来源于stack exchange,提问作者Alun
相关产品推荐
相关产品推荐

