如何在不使用富卡的情况下获取纯文本

时间:2018-06-18 11:04:40

标签: c# botframework

enter image description here

下图是我的QnA KB,在这里我只期待输出你好,我怎么能帮到你?但是,当我在模拟器中进行测试以及回答时,我会在下面看到小图像,如第一张图像突出显示的那样。

enter image description here 2

以下是我的以下代码:我是编码新手。请告知以下代码是否需要更改。

 public class RootDialog : QnAMakerDialog        //IDialog<object>
    {
        public async Task StartAsync(IDialogContext context)
        {
            /* Wait until the first message is received from the conversation and call MessageReceviedAsync 
            *  to process that message. */
            context.Wait(this.MessageReceivedAsync);
        }
        protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
        {
            var reply1 = context.MakeMessage();
            var answer = result.Answers.First().Answer;
            Activity reply = ((Activity)context.Activity).CreateReply();
            string[] qnaAnswerDate = answer.Split(';');
            int dataSize = qnaAnswerDate.Length;
            if (dataSize > 1 && dataSize <= 4)
            {
                var attachment = GetSelectedCard(answer);
                reply.Attachments.Add(attachment);

                await context.PostAsync(reply);
            }
            else
            {
                await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
                await context.PostAsync(reply);
            }
        }
        private static Attachment GetSelectedCard(string answer)
        {
            int len = answer.Split(';').Length;
            switch (len)
            {
                case 4: return GetHeroCard(answer);
                default: //return GetHeroCard(answer);
                    return null;
            }
        }

        private static Attachment GetHeroCard(string answer)
        {
            string[] qnaAnswerData = answer.Split(';');
            string title = qnaAnswerData[0];
            string description = qnaAnswerData[1];
            string url = qnaAnswerData[2];
            string imageURL = qnaAnswerData[3];
            HeroCard card = new HeroCard
            {
                Title = title,
                Subtitle = description,
            };
            card.Buttons = new List<CardAction>
                              {
                                  new CardAction(ActionTypes.OpenUrl,"Learn More" ,value:url)
                              };
            card.Images = new List<CardImage>
                              {
                                  new CardImage(url=imageURL)
                              };
            return card.ToAttachment();
        }
        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            /* When MessageReceivedAsync is called, it's passed an IAwaitable<IMessageActivity>. To get the message,
             *  await the result. */
            var message = await result;
            // var qnaAuthKey = Utils.GetAppSetting("QnAAuthKey");
            var qnaAuthKey = GetSetting("QnAAuthKey");
            // var qnaKBId = Utils.GetAppSetting("QnAKnowledgebaseId");
            // var endpointHostName = Utils.GetAppSetting("QnAEndpointHostName");
            var qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
            var endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];

            // QnA Subscription Key and KnowledgeBase Id null verification
            if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
            {
                // Forward to the appropriate Dialog based on whether the endpoint hostname is present
                if (string.IsNullOrEmpty(endpointHostName))
                    await context.Forward(new BasicQnAMakerPreviewDialog(), AfterAnswerAsync, message, CancellationToken.None);
                else
                    await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
            }
            else
            {
                await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
            }

        }

        private async Task AfterAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            // wait for the next user message
            context.Wait(MessageReceivedAsync);
        }

        public static string GetSetting(string key)
        {
            var value = ConfigurationManager.AppSettings[key];
            if (String.IsNullOrEmpty(value) && key == "QnAAuthKey")
            {
                value = ConfigurationManager.AppSettings["QnASubscriptionKey"]; // QnASubscriptionKey for backward compatibility with QnAMaker (Preview)
            }
            return value;
        }
    }

    // Dialog for QnAMaker Preview service
    [Serializable]
    public class BasicQnAMakerPreviewDialog : QnAMakerDialog
    {
        public BasicQnAMakerPreviewDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "No good match in FAQ.", 0.5)))
        { }
    }

    // Dialog for QnAMaker GA service
    [Serializable]
    public class BasicQnAMakerDialog : QnAMakerDialog
    {

        public BasicQnAMakerDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "No good match in FAQ.", 0.5, 1, ConfigurationManager.AppSettings["QnAEndpointHostName"])))
        {
        }
    }

1 个答案:

答案 0 :(得分:5)

  

将小图片放到我的答案下面

如果您向用户发送如下所示的空 HeroCard ,则会将其呈现为空白图像。

enter image description here

  

我是编码新手。请告知以下代码是否需要进行任何更改。

在您的代码中,我们可以发现您将消息转发到 BasicQnAMakerDialog 以获取QnAMaker GA服务,因此我假设您使用的是QnAMaker GA服务并使用GA QnAMaker服务用于启动QnAMakerDialog以响应用户查询的凭据。您可以参考以下示例代码来修改项目。

[Serializable]
public class RootDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        /* Wait until the first message is received from the conversation and call MessageReceviedAsync 
        *  to process that message. */
        context.Wait(this.MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        /* When MessageReceivedAsync is called, it's passed an IAwaitable<IMessageActivity>. To get the message,
            *  await the result. */
        var message = await result;
        // var qnaAuthKey = Utils.GetAppSetting("QnAAuthKey");
        var qnaAuthKey = ConfigurationManager.AppSettings["QnAAuthKey"];
        var qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
        var endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];

        // QnA Subscription Key and KnowledgeBase Id null verification
        if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
        {
            await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
        }
        else
        {
            await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
        }

    }

    private async Task AfterAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        // wait for the next user message
        context.Wait(MessageReceivedAsync);
    }

}

// Dialog for QnAMaker GA service
[Serializable]
public class BasicQnAMakerDialog : QnAMakerDialog
{
    public BasicQnAMakerDialog() : base(new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnAAuthKey"], ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "No good match in FAQ.", 0.5, 1, ConfigurationManager.AppSettings["QnAEndpointHostName"])))
    {
    }

    protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
    {
        var answer = result.Answers.First().Answer;
        Activity reply = ((Activity)context.Activity).CreateReply();
        string[] qnaAnswerDate = answer.Split(';');
        int dataSize = qnaAnswerDate.Length;

        if (dataSize > 1 && dataSize <= 4)
        {
            var attachment = GetSelectedCard(answer);
            reply.Attachments.Add(attachment);

            await context.PostAsync(reply);
        }
        else
        {
            await context.PostAsync(answer);
        }
    }

    private async Task AfterBasicQnAMakeAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        context.Wait(MessageReceivedAsync);
    }

    private static Attachment GetSelectedCard(string answer)
    {
        int len = answer.Split(';').Length;
        switch (len)
        {
            case 4: return GetHeroCard(answer);
            default: //return GetHeroCard(answer);
                return null;
        }
    }

    private static Attachment GetHeroCard(string answer)
    {
        string[] qnaAnswerData = answer.Split(';');
        string title = qnaAnswerData[0];
        string description = qnaAnswerData[1];
        string url = qnaAnswerData[2];
        string imageURL = qnaAnswerData[3];
        HeroCard card = new HeroCard
        {
            Title = title,
            Subtitle = description,
        };
        card.Buttons = new List<CardAction>
                            {
                                new CardAction(ActionTypes.OpenUrl,"Learn More" ,value:url)
                            };
        card.Images = new List<CardImage>
                            {
                                new CardImage(url=imageURL)
                            };
        return card.ToAttachment();
    }
}

测试结果:

enter image description here