捕获环境的匿名方法闭包不可序列化

时间:2017-08-16 17:08:12

标签: c# botframework

我收到以下错误:

  

异常:捕获环境的匿名方法闭包不可序列化,请考虑删除环境捕获或使用反射序列化代理:assistant.dialogs.Forms.SupportRequest +<> c__DisplayClass7_0'

当我尝试在Chain中设置内部属性时。

你能帮忙吗?

我的代码:

public enum SystemSelection { SharePoint, BizTalk, Azure, Office365 };
public enum RequestType { Bug, SupportRequest, Question };
public enum Importance { Blocking, High, Medium, Low };

[Serializable]
class Declaration
{
    public string Type;
    public string Amount;
    public string Date;

    public static IForm<Declaration> BuildForm()
    {
        return new FormBuilder<Declaration>()
                .Message("Add a declaration")
                .Build();
    }
}

[Serializable]
class SupportRequest
{

    public SystemSelection? SystemSelection;
    public RequestType? RequestType;
    public Importance? Importance;

    public Declaration Declaration;

    public static IForm<SupportRequest> BuildForm()
    {
        return new FormBuilder<SupportRequest>()
                .Message("Welcome to the simple support bot!")
                .AddRemainingFields()
                .Build();
    }

    internal static IDialog<SupportRequest> MakeRootDialog3()
    {
        SupportRequest t = null;
        var dlg = Chain.ContinueWith(FormDialog.FromForm(SupportRequest.BuildForm),
                            async (context, res) =>
                            {
                                t = await res;
                                return Chain.ContinueWith<Declaration, SupportRequest>(FormDialog.FromForm(Declaration.BuildForm),
                                                            async (context2, res2) =>
                                                            {
                                                                t.Declaration = await res2;
                                                                return Chain.Return(t);
                                                            });
                            });

        return dlg;
    }
}

1 个答案:

答案 0 :(得分:1)

这是预期的,因为匿名方法不是可序列化的,并且您需要docs来确保所有对话框都是可序列化的:

  

确保所有对话框都可序列化。   这可以像在IDialog实现上使用[Serializable]属性一样简单。但是,请注意,如果匿名方法闭包引用其外部环境来捕获变量,则它们不可序列化。 Bot Framework支持基于反射的序列化代理,以帮助序列化未标记为可序列化的类型。

您必须使用非匿名方法替换您定义为匿名方法的ResumeAfter<T>延续。

或者,您可以尝试通过将Reflection Serialization Surrogate添加到Autofac容器来注册它。在您的global.asax中,尝试添加以下代码:

Conversation.UpdateContainer(builder =>
{   
    builder.RegisterModule(new ReflectionSurrogateModule());
});