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

.NET Core WebAPI通过Twilio接收短信遇问题求助

解决.NET Core API接收Twilio短信WebHook的问题

嘿,我看了你这段接收Twilio短信的API代码,本地用Fiddler和Postman测都能拿到200 OK,但和Twilio实际集成的时候肯定卡壳了对吧?结合你的代码和Twilio的特性,给你梳理几个关键的优化和排查点:

  • 必须返回合法的TwiML响应
    Twilio的WebHook要求返回符合TwiML规范的XML,你现在返回的Ok()其实是空内容,Twilio会判定这个响应无效,甚至重复发送请求。修改代码返回正确的TwiML:

    [HttpPost]
    [Route(Constants.Save)]
    [Produces("application/xml")]
    public ActionResult SaveText(TextMessage TextInfo)
    {
        // 你的短信保存逻辑
        var twiml = new Twilio.TwiML.MessagingResponse();
        // 不需要自动回复的话,返回空的<Response>标签即可;需要回复就添加下面这行
        // twiml.Message("已收到你的消息!");
        return Content(twiml.ToString(), "application/xml");
    }
    

    记得先安装Twilio的NuGet包Twilio,用官方SDK构建TwiML能避免手动写XML的格式错误。

  • 确保模型绑定参数匹配
    Twilio发送的请求是application/x-www-form-urlencoded格式,你的TextMessage类属性名必须和Twilio的参数名完全一致,比如:

    public class TextMessage
    {
        public string From { get; set; } // 发送者手机号
        public string To { get; set; } // 你的Twilio虚拟号码
        public string Body { get; set; } // 短信内容
        // 按需添加其他参数,比如MessageSid、NumMedia等
    }
    

    如果参数名不匹配,模型绑定会失败,导致TextInfo为空,你的保存逻辑就没法正常执行。

  • 验证API的公网可访问性
    本地测试没问题,但Twilio需要能访问到公网上的API地址。开发阶段可以用端口映射工具把本地服务暴露到公网,同时要确保Twilio控制台设置的WebHook URL和你的API路由完全一致(包括大小写、路径参数)。

  • 添加Twilio请求验证(可选但推荐)
    为了避免恶意请求,最好在API里添加Twilio的请求验证逻辑:

    // 在Program.cs(.NET 6+)中配置服务
    builder.Services.AddTwilioClient();
    builder.Services.AddSingleton<RequestValidator>(sp => 
        new RequestValidator(builder.Configuration["Twilio:AuthToken"]));
    
    // 在Controller中注入验证器
    private readonly RequestValidator _requestValidator;
    public MfaController(RequestValidator requestValidator)
    {
        _requestValidator = requestValidator;
    }
    
    [HttpPost]
    [Route(Constants.Save)]
    [Produces("application/xml")]
    public ActionResult SaveText(TextMessage TextInfo)
    {
        // 验证Twilio请求合法性
        var request = HttpContext.Request;
        var signature = request.Headers["X-Twilio-Signature"].ToString();
        var fullUrl = $"{request.Scheme}://{request.Host}{request.Path}{request.QueryString}";
        
        if (!_requestValidator.Validate(fullUrl, request.Form, signature))
        {
            return Forbid(); // 验证失败直接拒绝
        }
        
        // 你的保存逻辑
        var twiml = new Twilio.TwiML.MessagingResponse();
        return Content(twiml.ToString(), "application/xml");
    }
    
  • 查看Twilio控制台调试日志
    如果还是有问题,去Twilio控制台的「调试器」里看详细的请求日志,里面会显示Twilio发送请求的返回码、错误原因,这是定位问题最快的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:48