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

如何基于C# ASP.NET WebAPI实现Dialogflow webhook的插槽校验

Dialogflow Webhook 参数校验(ASP.NET WebApi C# 实现)

前置准备

  • 安装NuGet依赖包:Google.Cloud.Dialogflow.V2,版本建议匹配你Dialogflow Agent使用的API v2版本
  • 确认你的WebApi接口已开放POST访问,且支持JSON格式参数解析

核心Controller实现

using Google.Cloud.Dialogflow.V2;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;

[Route("api/[controller]")]
[ApiController]
public class DialogflowWebhookController : ControllerBase
{
    // 替换为你自己的数据库校验服务,这里仅做示例
    private readonly IDbCheckService _dbCheckService;
    public DialogflowWebhookController(IDbCheckService dbCheckService)
    {
        _dbCheckService = dbCheckService;
    }

    [HttpPost]
    public async Task<IActionResult> Post([FromBody] WebhookRequest request)
    {
        var response = new WebhookResponse();
        // 提取当前会话的所有活跃上下文,后续校验失败时保留
        var currentContexts = request.QueryResult.OutputContexts.ToList();
        // 替换为你要校验的参数名,示例为校验订单号order_id
        bool hasTargetParam = request.QueryResult.Parameters.Fields.TryGetValue("order_id", out var paramValue);
        string targetParam = hasTargetParam ? paramValue.StringValue : string.Empty;

        // 数据库校验逻辑
        bool isValid = await _dbCheckService.CheckOrderIdExists(targetParam);
        if (!isValid)
        {
            // 校验失败:返回错误提示+保留当前上下文,停留在当前参数收集步骤
            response.FulfillmentText = "你输入的订单号不存在,请重新输入正确的订单号";
            // 保留原有上下文,生命周期设为1,确保停留在当前会话节点
            response.OutputContexts.AddRange(currentContexts.Select(c => new Context
            {
                Name = c.Name,
                LifespanCount = 1,
                Parameters = c.Parameters
            }));
            return Ok(response);
        }

        // 校验通过:走原有正常逻辑,从数据库取数据返回
        var orderInfo = await _dbCheckService.GetOrderInfo(targetParam);
        response.FulfillmentText = $"查询到订单信息:{orderInfo}";
        // 可根据业务需要清除当前上下文或跳转其他节点
        return Ok(response);
    }
}

// 示例数据库校验服务接口,替换为你自己的实现
public interface IDbCheckService
{
    Task<bool> CheckOrderIdExists(string orderId);
    Task<string> GetOrderInfo(string orderId);
}

注意事项

  • 校验失败时不要清空输出上下文,也不要将上下文生命周期设为0,否则会直接退出当前意图流程
  • 参数提取时建议用TryGetValue判空,避免参数不存在时抛出空引用异常
  • 如果你的Dialogflow Agent配置了多轮slot填充,保留上下文的方式会自动触发当前缺失参数的重新询问,不需要额外配置事件

内容的提问来源于stack exchange,提问作者Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:27:02