如何在Microsoft Bot框架中的对话框之间传递对象



我正在尝试在机器人框架中的两个对话框之间传递 IList<Attachment>的对象。这是我的代码现在的外观:

主对话框:

[Serializable]
public class CarouselCardsDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
    }
    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        //This object, 'attachments' is what I need to pass to the child dialog.
        IList<Attachment> attachments = GetCardsAttachments();
        context.Call(new CarouselDialog(attachments), ResumeAfterPrompt);
    }
    private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
    {
        string input = await result;
        await context.PostAsync(input);
        context.Wait(MessageReceivedAsync);
    }
    private static IList<Attachment> GetCardsAttachments()
    {
        //Get a list of attachment
    }
}

这是孩子对话。我想将附件列表从carouselcardsdialog传递给此对象:

[Serializable]
public class CarouselDialog : IDialog<string>
{
    private IList<Attachment> _attachments;
    public CarouselDialog(IList<Attachment> attachments)
    {
        _attachments = attachments;
    }
    public async Task StartAsync(IDialogContext context)
    {
        IMessageActivity reply = context.MakeMessage();
        reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
        reply.Attachments = _attachments;
        await context.PostAsync(reply);
        context.Wait(MessageReceivedAsync);
    }
    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        IMessageActivity activity = await result;
        context.Done(activity.Text);
    }
}

但是,当我运行此代码时,我会收到此错误:

例外:在汇编中键入'Microsoft.bot.connector.attachment' 'microsoft.bot.connector,版本= 3.5.1.0,culture =中性, publicKeyToken = 31BF3856AD364E35'未标记为可序列化。

我在做什么错?有办法解决吗?

不确定异常,但是解决方法是为制作附件,然后将此数据保存在上下文的userData属性中创建一个模型。

context.UserData.SetValue<MyModel>("AttachmentsModel", instanceOfModel);

然后在第二个对话框中检索此模型

MyModel model;
context.UserData.TryGetValue<MyModel>("AttachmentsModel", out model);

我认为您也可以尝试将iattachment对象放在此属性中,但是模型会更好,因为它并不是真正容纳大型对象。

最新更新