IActivityLogger不记录PromptDialog.Choice文本

时间:2018-06-12 07:19:24

标签: c# botframework chatbot

我正在使用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类。

2 个答案:

答案 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);
    }
}

模拟器测试结果:

enter image description here

VS输出窗口:

enter image description here

此外,如果您在Logger中设置断点以调试和跟踪活动,那么当它呈现HeroCard以提示用户选择其中一个选项时,您会发现activity.AsMessageActivity()?.Text将为""

enter image description here

因此空字符串将写入VS Output窗口。

enter image description here

答案 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);
    }
}
相关问题