如何基于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
相关产品推荐
相关产品推荐

