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

ASP.NET Core 3.1开发Telegram Bot时Update对象无数据问题求助

问题原因定位与解决方法

你遇到的update对象为空的问题,90%以上是反序列化不匹配导致的,按以下步骤依次排查即可解决:

  • 1. 修复序列化组件适配问题

ASP.NET Core 3.1默认使用System.Text.Json作为序列化组件,而Telegram.Bot类库的所有数据类型均基于Newtonsoft.Json的特性开发,System.Text.Json无法识别相关注解导致反序列化失败。
方案一(推荐):切换为Newtonsoft.Json作为序列化组件

  1. 安装Nuget包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 修改Startup.cs中配置:
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddNewtonsoftJson();
    // 其余原有配置不变
}

方案二(不切换序列化组件):修改System.Text.Json适配规则

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddJsonOptions(opt =>
            {
                // 忽略属性大小写
                opt.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                // 适配驼峰命名
                opt.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            });
    // 其余原有配置不变
}
  • 2. 确认Update类型引用正确

检查代码顶部的命名空间引用,确保Update类来自Telegram.Bot.Types命名空间,而非你项目中自定义的同名类。

  • 3. 验证原始请求数据是否正常

在Update方法开头加入以下代码,打印Telegram推送的原始请求内容,确认数据正常到达:

[HttpPost("Update")]
[AllowAnonymous]
public async Task<IActionResult> Update([FromBody] Update update)
{
    // 新增原始请求打印逻辑
    Request.EnableBuffering();
    using var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true);
    string rawRequestBody = await reader.ReadToEndAsync();
    _logger.LogInformation("Telegram推送原始内容:{Content}", rawRequestBody);
    Request.Body.Position = 0;

    // 原有业务逻辑
    // ...
}

如果打印的内容为空,需要检查ngrok穿透配置、webhook回调地址是否正确;如果内容不为空,可以将JSON内容复制出来手动反序列化测试,定位具体字段不匹配问题。

  • 4. 增加接口格式限制

在Update方法上添加[Consumes("application/json")]特性,强制接口仅接收JSON格式请求,避免格式不匹配导致绑定失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:12:04