You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:15:41