对象引用未设置为 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 对话框的情况下工作。
测试结果:
您好,我正在研究 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 对话框的情况下工作。
测试结果: