Bot Framework调用QnAMaker遇类型转换错误:string无法转ITurnContext
解决QnAMaker GetAnswersAsync参数类型不匹配错误
错误原因
QnAMaker.GetAnswersAsync()方法的重载要求第一个参数必须是ITurnContext对象,你直接传入字符串类型的问题文本,导致类型转换失败,触发cannot convert from 'string' to 'Microsoft.Bot.Builder.ITurnContext'错误。
解决方案
方法1:使用支持双参数的重载
如果你的QnAMaker版本提供了GetAnswersAsync(ITurnContext, string)重载,直接修改代码,传入turnContext和问题文本即可:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { var value = turnContext.Activity.Value; if (value != null) { var val = value.ToString(); var relationsJSON = JToken.Parse(val); var text = relationsJSON["text"].ToString(); if (text == "car model") { // 修正参数:传入turnContext和问题文本 var result = await QnAMaker.GetAnswersAsync(turnContext, text); // 增加空值判断,避免索引越界 if (result != null && result.Length > 0) { await turnContext.SendActivityAsync(result[0].Answer, cancellationToken: cancellationToken); } else { await turnContext.SendActivityAsync("抱歉,我暂时无法回答这个问题。", cancellationToken: cancellationToken); } } } // 调用基类方法,保证默认流程执行 await base.OnTurnAsync(turnContext, cancellationToken); }
方法2:临时修改Activity文本(适配旧版本QnAMaker)
如果你的QnAMaker版本仅支持GetAnswersAsync(ITurnContext)重载,可以临时修改turnContext.Activity.Text为问题文本,调用后再恢复原文本:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { var value = turnContext.Activity.Value; if (value != null) { var val = value.ToString(); var relationsJSON = JToken.Parse(val); var text = relationsJSON["text"].ToString(); if (text == "car model") { // 保存原文本,避免影响后续流程 var originalText = turnContext.Activity.Text; // 设置问题文本到Activity turnContext.Activity.Text = text; var result = await QnAMaker.GetAnswersAsync(turnContext); // 恢复原文本 turnContext.Activity.Text = originalText; // 空值判断 if (result != null && result.Length > 0) { await turnContext.SendActivityAsync(result[0].Answer, cancellationToken: cancellationToken); } else { await turnContext.SendActivityAsync("抱歉,我暂时无法回答这个问题。", cancellationToken: cancellationToken); } } } await base.OnTurnAsync(turnContext, cancellationToken); }
注意事项
- 必须增加
result的空值和长度判断,防止没有匹配到答案时出现索引越界异常 - 务必调用
base.OnTurnAsync,否则会中断Bot Framework的默认生命周期流程
内容的提问来源于stack exchange,提问作者hamzah jazi
相关产品推荐
相关产品推荐

