对象引用未设置为 Microsoft Bot Framework 中对象的实例

Object reference not set to an instance of an object in Microsoft Bot Framework

您好,我正在研究 Microsoft Bot Framework,并且我正在使用 QnAMaker 和 LUIS 应用程序。

这里我的问题是,当我使用 QnAMaker 时,它提供了准确的答案;当我添​​加 LUIS 服务时,我在调试中得到了准确的答案;当我使用 [=11 向用户提供回复时=] 它默认转到异常部分,其显示的异常如下所示。

Object reference is not set be instance of object.

由于我是从 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)
        {

        }
    }

我认为您现在正在使用旧版本的 Bot Connector 和 Bot Builder DLL。因此,这就是为什么您从 Microsoft.Bot.Connector.

的源位置获取空引用异常的原因

因此,更新所有与 Bot Framework 相关的 DLL,如 3.15.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 field,所以它将return只有一个答案作为响应,你不需要使用foreach循环。
  • 要解决此问题,您可以尝试创建一个新的机器人应用程序,然后将 运行 您在 MessageReceivedAsync 方法中提供的代码放入并检查代码是否可以在不使用 LUIS 对话框的情况下工作。

测试结果: