You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:58