【问题标题】:context post async exception上下文发布异步异常
【发布时间】:2017-06-05 11:59:09
【问题描述】:

使用机器人模拟器:

在 MessagesController 中有这段代码:

 await Conversation.SendAsync(activity, () => new RootLuisDialog());

在 RootLuisDialog 中:

        [LuisIntent("")]
        [LuisIntent("None")]
        public async Task None(IDialogContext context, LuisResult result)
        {
            string message = $"Sorry, I did not understand '{result.Query}'. Type 'help' if you need assistance.";

            await context.PostAsync(message);

            context.Wait(this.MessageReceived);
        }

这是一个例外:

{"在程序集中键入'Microsoft.Bot.Connector.Activity' 'Microsoft.Bot.Connector,版本=3.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 未标记为可序列化。"} 数据:{System.Collections.ListDictionaryInternal} H结果:-2146233076 帮助链接:空 内部异常:空 消息:“在程序集“Microsoft.Bot.Connector”中键入“Microsoft.Bot.Connector.Activity”,版本=3.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 未标记为可序列化。” 资料来源:“mscorlib” StackTrace:“在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型)\r\n 在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型 类型,StreamingContext 上下文)\r\n 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()\r\n 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文, SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器, ObjectWriter objectWriter、SerializationBinder binder)\r\n at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)\r\n at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象 图, Header[] inHeaders, __BinaryWriter serWriter, Boolean f检查)\r\n 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流 serializationStream,对象图,Header[] 标头,布尔值 f检查)\r\n 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流 序列化流,对象图)\r\n at Microsoft.Bot.Builder.Internals.Fibers.FormatterStore1.Microsoft.Bot.Builder.Internals.Fibers.IStore<T>.Save(T item)\r\n at Microsoft.Bot.Builder.Internals.Fibers.ErrorResilientStore1.Microsoft.Bot.Builder.Internals.Fibers.IStore.Save(T 项目)\r\n 在 Microsoft.Bot.Builder.Internals.Fibers.FactoryStore1.Microsoft.Bot.Builder.Internals.Fibers.IStore<T>.Save(T item)\r\n at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__211.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.Bot.Builder.Dialogs.Internals.ReactiveDial og任务。 d__51.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.Bot.Builder.Dialogs.Internals.LocalizedDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__21.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.Bot.Builder.Dialogs.Internals.ScoringDialogTask1.&lt;Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync&gt;d__61.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.d__61.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__61.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.Bot.Builder.Dialogs.Conversation.d__4.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.Throw ForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.Bot.Builder.Dialogs.Conversation.d__2.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at MessengerBot.MessagesController.d__1.MoveNext() 在 C:\myapp\MessagesController.cs:第 60 行" 目标站点:{System.Reflection.MemberInfo[] InternalGetSerializableMembers(System.RuntimeType)}

我不太确定我是否理解这里的例外情况...... 有什么帮助吗?

编辑:我解决了带有参数 - 活动的 rootluisdialog 的新构造函数的问题。

await Conversation.SendAsync(activity, () => new RootLuisDialog(activity)); 然后在 RootLuisDialog 我有这个:

 Activity activity;
public RootLuisDialog(Activity activity)
        {
            this.activity = activity;

        }

【问题讨论】:

  • 如果问题已经解决,请删除问题
  • 虽然您应用的解决方案听起来不太对
  • 是的。它不是。有什么想法吗?
  • 下面的答案看起来很准确。不知道您为什么要保留该活动的参考。

标签: c# botframework azure-language-understanding


【解决方案1】:

Activity 类不可序列化,这是您看到的错误。 LuisDialog 中的所有公共或受保护属性都需要可序列化,以便它们可以存储为响应之间的上下文。

假设您的 Dialog 类是从 LuisDialog 继承的,那么这应该已经负责从意图中获取活动 - 通常您将使用上下文和来自 LUIS 的结果而不是直接使用活动(如如果你正在创建一个直接的 IDialog 实现,你会这样做)。

从控制器传递它也不会达到您的预期,因为它不会包含在对话中的后续调用中。

【讨论】:

  • 那么如何让这个Activity类序列化呢?
  • 你真的不能——你想用上下文和 LuisResult 做不了的活动做什么?
  • 我正在尝试转发到另一个对话框。
  • 所以,我直接调用 LuisDialog。它抛出一个异常。如何解决这个问题?
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多