1

嗨,我正在开发 Microsoft Bot Framework,并且正在使用包含 LUIS 应用程序的 QnAMaker。

在这里,我的问题是,当我在使用 QnAMaker 时,它提供了准确的答案,当我添加 LUIS 服务时,我在调试中得到了准确的答案,当我await context.PostAsync(answer);通过默认情况下转到异常部分向用户提供回复时它的显示异常如下所示。

对象引用未设置为对象的实例。

由于我从 QnAMaker 获取数据,在这里我无法理解 null 发生在哪里。

在下面,我将分享我为在 LUIS 识别意图和实体后获取对用户表单 QnAMaker 的响应而编写的代码

private async Task toGetTheResponsefromQnAMakerAsync(IDialogContext context, Activity activity)
    {
        var messagetext = (activity.Text).ToLower();
        var knowledgebaseId = ConfigurationManager.AppSettings["KnowledgeBaseId"];

        //Use subscription key assigned to you.
        var qnamakerSubscriptionKey = ConfigurationManager.AppSettings["QnAmakerSubscriptionKey"];
        var client = new HttpClient();
        var queryString = HttpUtility.ParseQueryString(string.Empty);

        // Request headers
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", qnamakerSubscriptionKey);

        var uri = "https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/subscription-id/generateAnswer?" + queryString;

        HttpResponseMessage response;

        // Request body
   byte[] byteData = Encoding.UTF8.GetBytes($"{{\"question\": \"{messagetext}\"}}");

        using (var content = new ByteArrayContent(byteData))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            response = await client.PostAsync(uri, content);
        }
        try
        {
            if (response.IsSuccessStatusCode)
            {
                var responseContent = response.Content.ReadAsStringAsync().Result;

                var QnAMakerResponse = JsonConvert.DeserializeObject<RootObject>(responseContent);

                if (QnAMakerResponse.answers != null)
                {
                    foreach (var item in QnAMakerResponse.answers)
                        // return our QnAMakerResponse to the user
                        answer = item.answer.ToString();
                        await context.PostAsync(answer);

                }
            }
        }
        catch (Exception e)
        {

        }
    }
4

2 回答 2

3

我想现在,您正在使用旧版本的 Bot Connector 和 Bot Builder DLL。因此,这就是您从 Microsoft.Bot.Connector 的源位置获得空引用异常的原因。

因此,将所有与 Bot Framework 相关的 DLL 更新为3.15.0等最新版本。

于 2018-04-17T05:56:09.897 回答
0

根据您的描述和代码,您似乎向 QnAMaker API 发出请求以检索给定问题的答案,并将答案发送给用户。我修改了您提供的代码并在我这边进行了测试,我没有收到该异常,您可以检查一下。

try
{
    if (response.IsSuccessStatusCode)
    {
        var responseContent = response.Content.ReadAsStringAsync().Result;

        var QnAMakerResponse = JsonConvert.DeserializeObject<Microsoft.Bot.Builder.CognitiveServices.QnAMaker.QnAMakerResults>(responseContent);

        if (QnAMakerResponse.Answers != null)
        {
            var answer = QnAMakerResponse.Answers.First().Answer;
            await context.PostAsync(answer);
        }
    }
}
catch (Exception e)
{

}

笔记:

  • 在我的代码中,我将 JSON 反序列化为 Microsoft.Bot.Builder.CognitiveServices.QnAMaker.QnAMakerResults 对象
  • 您没有在请求正文中指定top字段,因此它只会返回一个答案作为响应,您不需要使用 foreach 循环。
  • 要解决此问题,您可以尝试创建一个新的机器人应用程序,然后放置并运行您在 MessageReceivedAsync 方法中提供的代码,以检查代码是否可以在不使用 LUIS 对话框的情况下运行。

测试结果:

在此处输入图像描述

于 2018-04-17T06:47:04.160 回答