我正在使用 MS 机器人框架并尝试让机器人发送预定消息。为此,我使用了 Hangfire 框架。
我正在尝试使用此代码进行调度,其中上下文是从我的对话框传递的 IDialogContext 对象,而 SendScheduledMessageToUser 方法只是调用 context.PostAsync() 向用户发送消息:
BackgroundJob.Schedule(() => CurrencyDialog.SendScheduledMessageToUser(context), new DateTimeOffset(when));
问题是上下文结果为空。我在调用它的控制台中看到一个序列化异常。我假设你不能序列化上下文对象,因为它内部有循环引用。
因此,为了向用户发送预定消息,我最好的想法是获取用户信息(ID、对话 ID、 channel 、服务 URL 等),然后将这些简单数据传递给预定方法,以便它可以向用户发送消息。然而,令人难以置信的是,似乎没有办法从 IDialog 的实现内部获取用户数据。 IDialogContext 有该数据,但它被标记为私有(private)或内部,所以我无法获取它。而且我无法在对话框首次启动时将 Activity 对象传递给 Dialog,因为没有构造函数。
关于从 IDialog 的实现中获取用户信息或以其他方式获取一些可以序列化的数据以便向用户发送预定消息的任何想法?
最佳答案
还有另一种获取用户数据的方法。 在您的 Controllers Post 方法中执行此操作 -
case ActivityTypes.Message:
StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>("name", activity.From.Name);
//other properties you want to set.
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
然后在您的 intent 方法中,像这样访问它们 -
[LuisIntent("Greetings")]
public async Task Greetings(IDialogContext context, LuisResult result)
{
var username = context.UserData.Get<string>("name");
await context.PostAsync($"hi {username}");
context.Wait(MessageReceived);
}
这比手动创建事件要优雅得多。
关于c# - 无法序列化 IDialogContext;需要从 MS Bot Framework 中的 Dialog 对象中获取用户信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38890468/