表单生成器中的 BOT 框架应用程序中的异常:无法通过非托管方式序列化委托



我在FormFlow中遇到以下错误。 快速的帮助真的很可观。

异常:捕获环境的匿名方法闭包是 不可序列化,请考虑删除环境捕获或使用 反射序列化代理项: FlightBot.FlightManager+<>c__DisplayClass2_0", "附件": [ { "内容类型": "文本/纯文本", "content": " at Microsoft.Bot.Builder.Internals.Fibers.Serialization.ClosureCaptureErrorSurrogate.System.Runtime.Serialization.ISerializationSurrogate.GetObjectData(Object obj, SerializationInfo info, StreamingContext context(

在StackOverflow和GitHub上搜索后,我得到了一段代码,上面写着"你需要在autofac容器中注册它"。

所以我在WebAPIConfig中放置了下面的代码.cs

var builder = new ContainerBuilder();
builder.RegisterModule(new ReflectionSurrogateModule());
builder.Update(Conversation.Container);

但是我仍然得到一个错误,但是这次错误与以前不同

,如下所示,

"异常:无法通过非托管函数序列化委托 指针、动态方法或委托创建者外部的方法 程序集.", "附件": [ { "内容类型": "文本/纯文本", "content": " at System.MulticastDelegate.GetObjectData(SerializationInfo info, StreamingContext context(\r at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder(\r

我已经在这里复制了我应用程序的完整代码。

  1. 第一部分是消息控制器类,我从那里调用 飞行管理器,这是一个 LUIS 对话框。
  2. 代码的第二部分是 FlightManager 类,我从那里调用 航班预订舱位。
  3. 三是实际订舱位。

    [BotAuthentication]
    public class MessagesController : ApiController
    {
    internal static IDialog<object> MakeRootDialog()
    {
    return Chain.From(() => new FlightManager());
    }
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
    if (activity.Type == ActivityTypes.Message)
    {
    await Conversation.SendAsync(activity, MakeRootDialog);
    }
    else
    {
    HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
    }
    private Activity HandleSystemMessage(Activity message)
    {
    if (message.Type == ActivityTypes.DeleteUserData)
    {
    // Implement user deletion here
    // If we handle user deletion, return a real message
    }
    else if (message.Type == ActivityTypes.ConversationUpdate)
    {
    // Handle conversation state changes, like members being added and removed
    // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
    // Not available in all channels
    }
    else if (message.Type == ActivityTypes.ContactRelationUpdate)
    {
    // Handle add/remove from contact lists
    // Activity.From + Activity.Action represent what happened
    }
    else if (message.Type == ActivityTypes.Typing)
    {
    // Handle knowing tha the user is typing
    }
    else if (message.Type == ActivityTypes.Ping)
    {
    }
    return null;
    }
    }
    

namespace FlightBot
{
[LuisModel("luis model key", "luis secret")] 
[Serializable]
public class FlightManager : LuisDialog<object>
{
public async Task FlightBookingTask(IDialogContext context, LuisResult result)
{
PromptDialog.Confirm(
context: context,
resume: ResumeAndHandleConfirmAsync,
prompt: $"It seems you wish to book a flight. Do you wish to continue?",
retry: "I didn't understand. Please try again.");
}
private async Task ResumeAndHandleConfirmAsync(IDialogContext context, IAwaitable<bool> argument)
{
FlightBooking cb = new FlightBooking();
BuildFormDelegate<FlightBooking> MakeFlightBookingForm = () => FlightBooking.BuildForm(context);
var flightBooking = new FormDialog<FlightBooking>(cb, MakeFlightBookingForm, FormOptions.PromptInStart, null);
context.Call(flightBooking, FlightBookingComplete);
}
private async Task FlightBookingComplete(IDialogContext context, IAwaitable<FlightBooking> result)
{
context.Wait(MessageReceived);
}
}
}

namespace FlightBot
{
[Serializable]
public class FlightBooking
{
[Prompt("Enter source :")]
public string Source { get; set; }
[Prompt("Enter destination :")]
public string Destination { get; set; }
public static IForm<FlightBooking> BuildForm(IDialogContext context)
{
return new FormBuilder<FlightBooking>().Message("Tell me about flight details!")
.Field(nameof(Source))
.Field(nameof(Destination))
.Build();
}
}
}

我遇到了第一个例外,据我所知,当您调用此行中的表单构建器方法时,您无法发送参数:

BuildFormDelegate<FlightBooking> MakeFlightBookingForm = () => FlightBooking.BuildForm(context);

因此,请确保声明的方法没有任何参数:

public static IForm<FlightBooking> BuildForm()
{ //code   }

我希望这可以帮助您,祝您的机器人好运!

最新更新