我正在使用IActivityLogger记录bot和用户之间的对话。 这里记录器记录了除ProptDialog.Choice()生成文本之外的所有消息
我已经测试了其他PromptDialog方法,如
PromptDialog.Confirm()
PromptDialog .Text()
这些工作我的意思是记录这些方法中的文本,只有PromptDialog.Choice文本没有访问IActivityLogger。
Logger.cs
public class Logger : IActivityLogger
{
public async Task LogAsync(IActivity activity)
{
Debug.WriteLine(activity.AsMessageActivity()?.Text);
}
}
RootDialog.cs
public async Task StartAsync(IDialogContext context)
{
string[] choices = new string[]{ "choice 1" , "choice 2"};
PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");
}
private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<object> result)
{
await context.PostAsync((await result).ToString());
context.Done<object>(null);
}
除了RootDialog中的PromptDialog.Choice()之外,来往于消息的所有其他消息都将通过Logger类。
答案 0 :(得分:3)
PromptDialog.Choice文本未访问IActivityLogger
我创建了一个示例并尝试重现该问题,当我从PromptDialog.Choice
选项列表中选择一个选项时,我发现它可以点击记录器。
RootDialog:
[Serializable]
public class RootDialog : IDialog<object>
{
public Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
string[] choices = new string[] { "choice 1", "choice 2" };
PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");
}
private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
{
string choice = await result;
await context.PostAsync($"You sent {choice}");
//context.Done<object>(null);
}
}
记录器:
public class DebugActivityLogger : IActivityLogger
{
public async Task LogAsync(IActivity activity)
{
Debug.WriteLine(activity.AsMessageActivity()?.Text);
}
}
模拟器测试结果:
VS输出窗口:
此外,如果您在Logger中设置断点以调试和跟踪活动,那么当它呈现HeroCard以提示用户选择其中一个选项时,您会发现activity.AsMessageActivity()?.Text
将为""
。
因此空字符串将写入VS Output窗口。
答案 1 :(得分:1)
我非常简单地测试过这个,但它应该可行。如果在IActivityLogger
实施中,您可以向下钻取的距离不仅仅是activity.text
。有些活动可能需要,您可以通过简单地使用一些if语句来完成。我认为,除了这种情况之外,还有更多情况需要深入研究一个活动,而不仅仅是activity.text属性。因此,使用类似的策略来记录您想要记录其他独特类型内容的信息应该适合您。
例如:
public class Logger : IActivityLogger
{
public async Task LogAsync(IActivity activity)
{
IMessageActivity a = activity.AsMessageActivity();
//loop through for cases there are multiple attachments
for (int i = 0; i < a.Attachments.Count; i++)
{
//in the case of herocard
if (a.Attachments[i].ContentType == "application/vnd.microsoft.card.hero")
{
//log something, i randomly picked a property
Debug.WriteLine(a.Attachments[i].Name);
}
//another case
if (a.Attachments[i].ContentType.Contains("image"))
{
//Maybe save the image somewhere
}
}
Debug.WriteLine(activity.AsMessageActivity()?.Text);
}
}