我在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
我已经在这里复制了我应用程序的完整代码。
- 第一部分是消息控制器类,我从那里调用 飞行管理器,这是一个 LUIS 对话框。
- 代码的第二部分是 FlightManager 类,我从那里调用 航班预订舱位。
三是实际订舱位。
[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 }
我希望这可以帮助您,祝您的机器人好运!