C# 如何连接反序列化的QnAResponse字符串来代替{filename}?
在本文档中,它显示了QnA Maker服务执行Rest调用和反序列化Json响应-步骤3* 我想寻找的模块字符串的特定部分:C# 如何连接反序列化的QnAResponse字符串来代替{filename}?,c#,json,botframework,qnamaker,C#,Json,Botframework,Qnamaker,在本文档中,它显示了QnA Maker服务执行Rest调用和反序列化Json响应-步骤3* 我想寻找的模块字符串的特定部分: /* START - QnA Maker Response Class */ public class Metadata { public string name { get; set; } public string value { get; set; } } public class Answer { public IList<stri
/* START - QnA Maker Response Class */
public class Metadata
{
public string name { get; set; }
public string value { get; set; }
}
public class Answer
{
public IList<string> questions { get; set; }
public string answer { get; set; }
public double score { get; set; }
public int id { get; set; }
public string source { get; set; }
public IList<object> keywords { get; set; }
public IList<Metadata> metadata { get; set; }
}
public class QnAAnswer
{
public IList<Answer> answers { get; set; }
}
/* END - QnA Maker Response Class */
/*开始-QnA制造商响应类*/
公共类元数据
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
公开课答案
{
公共IList问题{get;set;}
公共字符串答案{get;set;}
公共双倍分数{get;set;}
公共int id{get;set;}
公共字符串源{get;set;}
公共IList关键字{get;set;}
公共IList元数据{get;set;}
}
公共类QNAR答案
{
公共IList答案{get;set;}
}
/*结束-QnA生成器响应类*/
我不想猜测这其中的哪一部分会有答案,但QNA应该简单地用文件名回答一个问题,然后需要将该文件名连接到@~\folder\folder\文件名.json中,这样一个适当的存储自适应卡就会显示为响应
我提供了比必要的更多的上下文,因为我确信还有其他人希望在有问题需要时,用一种简单的方式展示一张卡片
请随意编辑或用适当的术语重新表述
谢谢如果我答对了你的问题,你正在寻找机器人的答案。如果是这样,答案将出现在HTTP响应的主体中,如下所示
{
"answers": [
{
"questions": [
"What is the closing time?"
],
"answer": "10.30 PM",
"score": 100,
"id": 1,
"source": "Editorial",
"metadata": [
{
"name": "restaurant",
"value": "paradise"
},
{
"name": "location",
"value": "secunderabad"
}
]
}
]
}
所以从理论上讲,这是答案
编辑:
您需要先添加此方法:
public string GetAnswer(string query)
{
var client = new RestClient( qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "EndpointKey " + endpointKey);
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"question\": \"" + query + "\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
// Deserialize the response JSON
QnAAnswer answer = JsonConvert.DeserializeObject<QnAAnswer>(response.Content);
// Return the answer if present
if (answer.answers.Count > 0)
return answer.answers[0].answer;
else
return "No good match found.";
}
}
publicstringgetanswer(字符串查询)
{
var client=new RestClient(qnaservicecostname+“/qnamaker/knowledgebase/“+knowledgeBaseId+”/generateAnswer”);
var请求=新的重新请求(Method.POST);
AddHeader(“授权”、“EndpointKey”+EndpointKey);
AddHeader(“内容类型”、“应用程序/json”);
AddParameter(“application/json”,“{\'question\:\”“+query+“\”}”,ParameterType.RequestBody);
IRestResponse response=client.Execute(请求);
//反序列化响应JSON
QnAAnswer=JsonConvert.DeserializeObject(response.Content);
//如果有,请返回答案
如果(answer.answers.Count>0)
返回答案。答案[0]。答案;
其他的
返回“未找到好匹配项。”;
}
}
然后你可以打电话:
Console.WriteLine(“今天天气如何的答案是:”+GetAswers(“今天天气如何”)+“…答案结束”)代码>
好了。如果我答对了你的问题,你正在寻找机器人的答案。如果是这样,答案将出现在HTTP响应的主体中,如下所示
{
"answers": [
{
"questions": [
"What is the closing time?"
],
"answer": "10.30 PM",
"score": 100,
"id": 1,
"source": "Editorial",
"metadata": [
{
"name": "restaurant",
"value": "paradise"
},
{
"name": "location",
"value": "secunderabad"
}
]
}
]
}
所以从理论上讲,这是答案
编辑:
您需要先添加此方法:
public string GetAnswer(string query)
{
var client = new RestClient( qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "EndpointKey " + endpointKey);
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"question\": \"" + query + "\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
// Deserialize the response JSON
QnAAnswer answer = JsonConvert.DeserializeObject<QnAAnswer>(response.Content);
// Return the answer if present
if (answer.answers.Count > 0)
return answer.answers[0].answer;
else
return "No good match found.";
}
}
publicstringgetanswer(字符串查询)
{
var client=new RestClient(qnaservicecostname+“/qnamaker/knowledgebase/“+knowledgeBaseId+”/generateAnswer”);
var请求=新的重新请求(Method.POST);
AddHeader(“授权”、“EndpointKey”+EndpointKey);
AddHeader(“内容类型”、“应用程序/json”);
AddParameter(“application/json”,“{\'question\:\”“+query+“\”}”,ParameterType.RequestBody);
IRestResponse response=client.Execute(请求);
//反序列化响应JSON
QnAAnswer=JsonConvert.DeserializeObject(response.Content);
//如果有,请返回答案
如果(answer.answers.Count>0)
返回答案。答案[0]。答案;
其他的
返回“未找到好匹配项。”;
}
}
然后你可以打电话:
Console.WriteLine(“今天天气如何的答案是:”+GetAswers(“今天天气如何”)+“…答案结束”)代码>
就这样
QNA应该简单地用文件名回答问题,然后需要将文件名连接在@~\folder\folder\filename.json的位置,这样一个正确存储的自适应卡就会显示为响应
似乎您希望根据QnA Maker服务返回的结果,从json文件动态呈现自适应卡。要实现该要求,可以参考以下示例代码
[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
var replymes = context.MakeMessage();
var answer = GetAnswer(result.Query);
var cardjson = await GetCardText($"{answer}");
var results = AdaptiveCard.FromJson(cardjson);
var card = results.Card;
replymes.Attachments.Add(new Attachment()
{
Content = card,
ContentType = AdaptiveCard.ContentType,
Name = "Card"
});
await context.PostAsync(replymes);
context.Wait(MessageReceived);
}
GetCardText方法:
公共异步任务GetCardText(字符串cardName)
{
var path=System.Web.HttpContext.Current.Server.MapPath($“~/AdaptiveCards/{cardName}.json”);
如果(!File.Exists(path))
返回字符串。空;
使用(var f=File.OpenText(path))
{
return wait f.ReadToEndAsync();
}
}
测试结果:
注意:
1) 在我上面的测试中,我的QnA Maker服务将直接返回文件名作为答案,因此我将返回的答案作为文件名传递
2) 我在我的bot应用程序中使用它来构建自适应卡对象
QNA应该简单地用文件名回答问题,然后需要将文件名连接在@~\folder\folder\filename.json的位置,这样一个正确存储的自适应卡就会显示为响应
似乎您希望根据QnA Maker服务返回的结果,从json文件动态呈现自适应卡。要实现该要求,可以参考以下示例代码
[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
var replymes = context.MakeMessage();
var answer = GetAnswer(result.Query);
var cardjson = await GetCardText($"{answer}");
var results = AdaptiveCard.FromJson(cardjson);
var card = results.Card;
replymes.Attachments.Add(new Attachment()
{
Content = card,
ContentType = AdaptiveCard.ContentType,
Name = "Card"
});
await context.PostAsync(replymes);
context.Wait(MessageReceived);
}
GetCardText方法:
公共异步任务GetCardText(字符串cardName)
{
var path=System.Web.HttpContext.Current.Server.MapPath($“~/AdaptiveCards/{cardName}.json”);
如果(!File.Exists(path))
返回字符串。空;
使用(var f=File.OpenText(path))
{
return wait f.ReadToEndAsync();
}
}
测试结果:
注意:
1) 在我上面的测试中,我的QnA Maker服务将直接返回文件名作为答案