带SSO的MS Teams Bot实例化对话状态时出现空引用异常
Teams Bot SSO认证后抛出空引用异常(Redis自定义状态存储)
环境与背景
- 开发带Bot功能的Microsoft Teams应用,基于Azure AD实现SSO认证,使用
Microsoft.Bot.Builder.Dialogs包 - 对话状态存储在自定义Redis缓存存储中
- 开发遵循官方SSO实现规范
问题现象
新用户首次访问应用时,授权流程正常触发并完成,但完成授权后立即抛出空引用异常:
at Microsoft.Bot.Builder.Dialogs.ComponentDialog.BuildDialogState(DialogInstance instance) at Microsoft.Bot.Builder.Dialogs.ComponentDialog.CreateInnerDc(DialogContext outerDc, DialogInstance instance) at Microsoft.Bot.Builder.Dialogs.DialogContext.<EmitEventAsync>d__41.MoveNext() at Microsoft.Bot.Builder.Dialogs.DialogExtensions.<InternalRunAsync>d__1.MoveNext() at Microsoft.Bot.Builder.Dialogs.DialogExtensions.<RunAsync>d__0.MoveNext() at Teams.ControliQDialogBotHandler1.<OnTeamsSigninVerifyStateAsync>d__9.MoveNext() in
异常出现后等待几分钟,应用可自动恢复正常运行。
调试发现的关键线索
Redis中存储的对话状态JSON存在异常字段:
{"ConversationData":{"Workgroup":null,"WorkgroupId":1,"Client":"","ClientIdentifier":"","CiQToken":null},"DialogState":{"dialogStack":[{"id":"LoginDialog","state":{"dialogs":{"dialogStack":[{"id":"OAuthPrompt","state":{"options":null,"state":{"AttemptCount":0},"expires":"2023-03-06T12:50:49.9217743Z","caller":null},"StackIndex":null,"Version":null},{"id":"WaterfallDialog", "state":{"options":null,"values":{},"instanceId":"5c228607-a25e-4f1c-9a05-a258db893548","stepIndex":0}, "StackIndex":null,"Version":null}]}},"StackIndex":null,"Version":"PxgdwT2kgHXD18MXymvuyNERYjF3CBfAF9T/cbvv8rY="}]}}
当前时间:2023-10-27T10:54:16.5463674Z,对话ID:3c16056b-3bf5-4f73-8dac-db853fa47957
核心异常点:
OAuthPrompt的expires时间为2023-03-06,远早于当前时间,属于过期状态OAuthPrompt的options、StackIndex字段为nullWaterfallDialog的StackIndex字段为null
求解决方案
需要定位空引用异常的根本原因,并提供可落地的修复方案。
内容的提问来源于stack exchange,提问作者VSVIJAY
相关产品推荐
相关产品推荐

