对象引用未设置为Microsoft Bot Framework

时间:2018-04-16 14:31:25

标签: c# botframework luis qnamaker

您好我正在使用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)
        {

        }
    }

2 个答案:

答案 0 :(得分:3)

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

因此,请使用最新版本更新所有与Bot Framework相关的DLL,例如 3.15.0

答案 1 :(得分: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,因此它只会返回一个答案,您不需要使用foreach循环。
  • 要解决此问题,您可以尝试创建一个新的bot应用程序,然后放入并运行MessageReceivedAsync方法中提供的代码,以检查代码是否可以在不使用LUIS对话框的情况下工作。

测试结果:

enter image description here