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

DialogFlow CX调用.NET C# WebHook时WebhookRequest对象为空求助

排查DialogFlow CX Webhook无法绑定.NET Web API对象的问题

以下是针对性的排查和解决建议:

1. 验证WebhookRequest类结构与DialogFlow请求格式匹配

DialogFlow CX的Webhook请求是严格的JSON格式,字段名全为小驼峰(比如sessionInfo、fulfillmentInfo),你的WebhookRequest类必须完全对应这些字段,包括嵌套对象。如果类属性名是大驼峰(比如SessionInfo),需要显式指定JSON字段名:

示例(Newtonsoft.Json):

using Newtonsoft.Json;

public class WebhookRequest
{
    [JsonProperty("sessionInfo")]
    public SessionInfo SessionInfo { get; set; }

    [JsonProperty("fulfillmentInfo")]
    public FulfillmentInfo FulfillmentInfo { get; set; }
}

public class SessionInfo
{
    [JsonProperty("session")]
    public string SessionId { get; set; }

    [JsonProperty("parameters")]
    public Dictionary<string, object> Parameters { get; set; }
}

public class FulfillmentInfo
{
    [JsonProperty("tag")]
    public string Tag { get; set; }
}

示例(System.Text.Json):

using System.Text.Json.Serialization;

public class WebhookRequest
{
    [JsonPropertyName("sessionInfo")]
    public SessionInfo SessionInfo { get; set; }

    [JsonPropertyName("fulfillmentInfo")]
    public FulfillmentInfo FulfillmentInfo { get; set; }
}

2. 先接收原始JSON请求,排查序列化问题

暂时去掉[FromBody]绑定,直接读取原始请求内容,确认DialogFlow发送的JSON格式,同时手动反序列化测试:

[System.Web.Http.HttpPost]
public async Task<string> TestDialogFlowWebhook()
{
    var rawJson = await new StreamReader(Request.Content.ReadAsStreamAsync().Result).ReadToEndAsync();
    Console.WriteLine("原始请求JSON:" + rawJson);

    // 手动反序列化,捕获错误
    try
    {
        var request = JsonConvert.DeserializeObject<WebhookRequest>(rawJson);
        Console.WriteLine("反序列化成功:" + request.SessionInfo?.SessionId);
    }
    catch (Exception ex)
    {
        Console.WriteLine("反序列化失败:" + ex.Message);
    }

    return "";
}

3. 检查模型验证错误

在Action中添加模型状态检查,确认是否是字段不匹配导致的绑定失败:

[System.Web.Http.HttpPost]
public string TestDialogFlowWebhook([FromBody] WebhookRequest request)
{
    if (!ModelState.IsValid)
    {
        var errorMessages = ModelState.SelectMany(x => x.Value.Errors)
                                      .Select(e => e.ErrorMessage)
                                      .ToList();
        Console.WriteLine("模型验证错误:" + string.Join("; ", errorMessages));
    }

    return "";
}

4. 确认DialogFlow Webhook配置细节

  • 检查Webhook的URL是否完全匹配你的API路由(包括是否有路由前缀、HTTPS配置等)
  • 确认DialogFlow发送的请求Content-Type为application/json(Standard子类型默认是这个,但可以在DialogFlow的Webhook设置中确认)
  • 检查是否有防火墙、代理或API网关拦截了请求,导致请求内容不完整

5. 检查.NET Web API的序列化配置

如果使用的是Newtonsoft.Json,可配置兼容小驼峰字段:

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    MissingMemberHandling = MissingMemberHandling.Ignore
};

如果使用System.Text.Json,可开启大小写不敏感匹配:

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:10:57