C# 自适应卡未发送给用户

C# 自适应卡未发送给用户,c#,botframework,microsoft-teams,adaptive-cards,C#,Botframework,Microsoft Teams,Adaptive Cards,我目前正在尝试向Microsoft团队中的最终用户输出自适应卡,但每当我尝试发布此卡时,它都会返回一个错误。最重要的是,我所做的任何小调整,它也会返回一个错误,因此,我认为我所做的一定是一些有趣的错误,所以我正在寻求澄清,因为我是新来的。 下面是一个场景, i) 最终用户已输入回复并点击send,这会将其消息发送到以下功能 专用异步任务调用CreatePart2(IDialogContext上下文,IAwaitable电子邮件) { var callemail=以字符串形式等待电子邮件; ...

我目前正在尝试向Microsoft团队中的最终用户输出自适应卡,但每当我尝试发布此卡时,它都会返回一个错误。最重要的是,我所做的任何小调整,它也会返回一个错误,因此,我认为我所做的一定是一些有趣的错误,所以我正在寻求澄清,因为我是新来的。 下面是一个场景, i) 最终用户已输入回复并点击send,这会将其消息发送到以下功能

专用异步任务调用CreatePart2(IDialogContext上下文,IAwaitable电子邮件)
{
var callemail=以字符串形式等待电子邮件;
...
var cardJson=GetCardJson();
AdaptiveCardParseResult=AdaptiveCard.FromJson(cardJson);
自适应卡=结果卡;
IMessageActivity message=Activity.CreateMessageActivity();
message.Attachments=新列表();
Microsoft.Bot.Connector.Attachment plAttachment=新的Microsoft.Bot.Connector.Attachment()
{
ContentType=AdaptiveCard.ContentType,
内容=卡片
};
消息。附件。添加(拼盘);
message.ReplyToId=context.Activity.Id;
等待上下文。PostAsync(消息);
}
因此,这将抛出以下内容

System.NullReferenceException: 'Object reference not set to an instance of an object.'
我的适配卡如下:

{
“类型”:“AdaptiveCard”,
“正文”:[
{
“类型”:“文本块”,
“大小”:“中等”,
“重量”:“更大胆”,
“文本”:“我的通知”
},
{
“类型”:“文本块”,
“重量”:“更大胆”,
“文本”:“新票证”,
“包装”:正确
},
{
“类型”:“操作卡”,
“姓名”:“访问”,
“行动”:[
{
“类型”:“OpenUri”,
“姓名”:“访问”,
“目标”:[
{
“操作系统”:“默认”,
“uri”:https://www.microsoft.com"
}
]
}
]
},
{
“类型”:“事实集”,
“事实”:[
{
“标题”:“测试1”,
“值”:“你好”
},
{
“标题”:“测试2:”,
“值”:“测试”
}
]
}
],
“$schema”:”http://adaptivecards.io/schemas/adaptive-card.json",
“版本”:“1.0”
}
此处设置ReplyToId值,因为它抱怨以前为null。事情是在这之后,我想输出一个PromptDialog。确认对象,这样用户就会回复这个。Adaptive卡纯粹是为了输出一张漂亮的带有json的卡,json是使用外部源提供的信息创建的。这么说来,我正在努力实现的目标有什么根本性的错误吗?是否不允许我使用context.PostAsync()向最终用户发布自适应卡

所以需要在消息上设置ReplyToId(),这是我在做了一些研究后收集到的,但是一旦通过了这个障碍,我就会不断得到以下错误

"Microsoft.Bot.Connector.ErrorResponseException: 'Operation returned an invalid status code 'BadRequest''".

我可以看到您正在使用活动。CreateMessageActivity(),当您使用此方法时,它将只创建新消息,而不创建传入消息上下文。因此,对话详细信息是空的。因此,您将收到异常。您需要使用activity.CreateReply()获取发送消息所需的适当数据和对话详细信息。请检查以下代码:

private async Task CallCreatePart2(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
                var activity = await argument as Activity;
                var cardJson = GetCardJson();
                AdaptiveCardParseResult result = AdaptiveCard.FromJson(cardJson);
                AdaptiveCard card = result.Card;
                IMessageActivity message = activity.CreateReply();
                message.Attachments = new List<Microsoft.Bot.Connector.Attachment>();
                Microsoft.Bot.Connector.Attachment plAttachment = new Microsoft.Bot.Connector.Attachment()
                {
                    ContentType = AdaptiveCard.ContentType,
                    Content = card
                };
                message.Attachments.Add(plAttachment);
                message.ReplyToId = context.Activity.Id;
                await context.PostAsync(message);
    }
专用异步任务调用CreatePart2(IDialogContext上下文,IAwaitable参数)
{
var activity=等待参数作为活动;
var cardJson=GetCardJson();
AdaptiveCardParseResult=AdaptiveCard.FromJson(cardJson);
自适应卡=结果卡;
IMessageActivity message=activity.CreateReply();
message.Attachments=新列表();
Microsoft.Bot.Connector.Attachment plAttachment=新的Microsoft.Bot.Connector.Attachment()
{
ContentType=AdaptiveCard.ContentType,
内容=卡片
};
消息。附件。添加(拼盘);
message.ReplyToId=context.Activity.Id;
等待上下文。PostAsync(消息);
}
事实证明,“BadRequest”错误实际上完全是由于传递到AdaptiveCard的数据造成的

string callCardJson = CreateJsonPayloadAsDataForAdapativeCard();
var myInfo = JsonConvert.DeserializeObject<JsonPayLoad>(callCardJson);
var templateJson = await WebhookController.GetCardText("my_template");
#if DEBUG
 templateJson = await WebhookController.GetCardText("my_template_test");
#endif
AdaptiveCardTemplate template = new AdaptiveCardTemplate(templateJson);
var myData = new
{
    title = myInfo.title,
    name = myInfo.name,
    token = myInfo.token,
    reference = myInfo.reference,
    info = my.info
};
string cardJson = template.Expand(myData);
AdaptiveCardParseResult result = AdaptiveCard.FromJson(cardJson);
card = result.Card;
string callCardJson=createJSONPayloadAsDataForAdaptiveCard();
var myInfo=JsonConvert.DeserializeObject(callCardJson);
var templateJson=wait WebhookController.GetCardText(“我的模板”);
#如果调试
templateJson=wait WebhookController.GetCardText(“我的模板测试”);
#恩迪夫
AdaptiveCardTemplate=新的AdaptiveCardTemplate(templateJson);
var myData=new
{
title=myInfo.title,
name=myInfo.name,
token=myInfo.token,
reference=myInfo.reference,
info=my.info
};
string cardJson=template.Expand(myData);
AdaptiveCardParseResult=AdaptiveCard.FromJson(cardJson);
卡片=结果。卡片;

因此,AdaptiveCard在多个场景中被用作通用卡,但并非所有场景中都需要所有数据字段,因此最初我将空白值传递到json数据对象中,用于上面的令牌和引用。当上面对其进行反序列化,然后将其传递到AdapativeCard时,它导致了“BadRequest”错误。我通过删除JSON数据对象中的空白条目来修复这个问题! 看起来您正在使用Bot Builder v3。是否正确?您是否能够共享通过调用GetCardJson()获得的自适应卡Json?是的,正确,这是使用Bot Bulder v3。我会修改这个问题,将自适应卡包括在内。谢谢你的回答。不幸的是,我现在收到以下错误:“Microsoft.Bot.Connector.ErrorResponseException:'操作返回了无效的状态代码'BadRequest'”。所以这个函数是从另一个任务函数调用的,它传递“null”作为第二个参数。所以我已经按照你的建议做了,但是设置了var activit