.Net Bot Framework中Adaptive Card提交空引用异常及代码求助
排查Bot Framework Adaptive Card提交时的空引用异常
嘿,我来帮你揪出这个空引用的问题!从你给出的代码片段来看,大概率是Adaptive Card的结构不完整,或者提交后的处理逻辑有遗漏,咱们一步步拆解排查:
1. 先补全Adaptive Card的核心结构
你目前的代码只添加了用户名和密码输入框,但缺少触发提交的按钮,也没有把Card正确封装成Attachment附加到回复消息里——这很可能是引发空引用的直接原因。
修正后的代码应该是这样的:
else if (lowerMessage == "test card") { var replyMessage = context.MakeMessage(); // 必须指定Adaptive Card的Schema版本,否则客户端可能解析失败 AdaptiveCard card = new AdaptiveCard(new AdaptiveSchemaVersion(1, 0)) { Body = new List<AdaptiveElement>() { new AdaptiveTextInput() { Id = "Username", Placeholder = "请输入用户名", IsRequired = true }, new AdaptiveTextInput() { Id = "Password", Placeholder = "请输入密码", IsPassword = true, IsRequired = true } }, // 添加提交按钮,这是触发表单提交的关键 Actions = new List<AdaptiveAction>() { new AdaptiveSubmitAction() { Title = "登录", Data = new { ActionType = "Login" } // 自定义标识,方便后续判断提交类型 } } }; // 把Adaptive Card包装成Attachment,这是Bot Framework识别卡片的标准方式 var cardAttachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card }; replyMessage.Attachments.Add(cardAttachment); await context.PostAsync(replyMessage); }
2. 检查Card提交数据的处理逻辑
空引用也可能出现在接收提交数据的环节——如果直接访问turnContext.Activity.Value而不做空值判断,就会触发异常。你需要在消息处理逻辑里添加对应的判断:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 优先判断是否是Adaptive Card的提交请求 if (turnContext.Activity.Value != null) { // 解析提交的表单数据 var loginData = JsonConvert.DeserializeObject<LoginFormData>(turnContext.Activity.Value.ToString()); // 先做空值校验,避免后续逻辑出错 if (string.IsNullOrWhiteSpace(loginData.Username) || string.IsNullOrWhiteSpace(loginData.Password)) { await turnContext.SendActivityAsync("请填写完整的用户名和密码哦!"); return; } // 这里写你的登录逻辑 await turnContext.SendActivityAsync($"收到登录请求:用户名 {loginData.Username}"); return; } // 下面是普通消息的处理逻辑(比如你的test card触发逻辑) var lowerMessage = turnContext.Activity.Text?.ToLower(); if (!string.IsNullOrEmpty(lowerMessage) && lowerMessage == "test card") { // 上面的卡片生成代码 } } // 定义对应的数据模型,方便解析提交的表单值 public class LoginFormData { public string Username { get; set; } public string Password { get; set; } }
3. 验证NuGet包版本兼容性
最后别忘了检查你的依赖包版本:Microsoft.Bot.Builder和AdaptiveCards(或者Microsoft.Bot.Builder.AdaptiveCards)的版本要尽量匹配,版本不兼容可能会导致卡片序列化/反序列化时出现空引用问题。
内容的提问来源于stack exchange,提问作者Rarceth
相关产品推荐
相关产品推荐

