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

Twilio接收消息HTTP POST格式解析及C#反序列化问题咨询

Twilio入站短信Webhook格式说明与C#解析方案

你收到的字符串格式

你接收到的是Twilio Webhook默认推送的application/x-www-form-urlencoded格式数据,不是JSON:

  • 键值对之间用&分隔,键和值之间用=分隔
  • 内容做了两层转义:首先是表单值的URL编码(空格转+、特殊符号转%XX格式),你看到的&是HTML实体转义后的&字符,解析前需要先还原
  • 你贴的内容末尾From=foofoo=2012-11-01存在转义/截断异常,正常From字段为发件人E.164格式号码,多出来的=2012-11-01需要检查接收流是否读取完整。

C# 解析实现

方案1:无第三方依赖,用内置API解析

不需要额外安装NuGet包,直接用System.Web下的内置工具类即可完成解析,自动处理两层转义:

using System;
using System.Collections.Specialized;
using System.Web;

// 接收到的原始webhook字符串
string rawContent = "ToCountry=GB&ToState=&SmsMessageSid=SM9e341f9cf646bf9ea3b7918e3f422202&NumMedia=0&ToCity=&SmsSid=SM9e341f9cf646bf9e22b7918e3f4r5402&SmsStatus=received&Body=New+Session+https%3A%2F%2Fsss.foo.com%2FDefault.aspx%3Fmt%3Dsms%26sid%3D5f631194-22d8-4d69-87c9-9c90d627aeb9&To=%2B447897031049&ToZip=&NumSegments=1&ReferralNumMedia=0&MessageSid=SM9e322f9cf226bf9ea3b7918e3f4d5702&AccountSid=GFrfb165c1a3c778dsasb6e13eee4a7208&From=foofoo=2012-11-01";

// 第一步:还原HTML转义字符
string htmlDecoded = HttpUtility.HtmlDecode(rawContent);
// 第二步:解析URL编码表单,自动完成所有值的URL解码
NameValueCollection formFields = HttpUtility.ParseQueryString(htmlDecoded);

// 直接按字段名取值即可
string toCountry = formFields["ToCountry"]; // 返回 "GB"
string smsStatus = formFields["SmsStatus"]; // 返回 "received"
string messageContent = formFields["Body"]; // 返回解码后的正文:"New Session https://sss.foo.com/Default.aspx?mt=sms&sid=5f631194-22d8-4d69-87c9-9c90d627aeb9"
string receiver = formFields["To"]; // 返回解码后的接收号码:"+447897031049"
int mediaCount = int.Parse(formFields["NumMedia"]); // 数字类型字段自行做类型转换

如果需要强类型对象,定义和字段名匹配的类,逐字段从NameValueCollection赋值即可,参考类定义:

public class TwilioInboundSms
{
    public string ToCountry { get; set; }
    public string ToState { get; set; }
    public string SmsMessageSid { get; set; }
    public int NumMedia { get; set; }
    public string ToCity { get; set; }
    public string SmsSid { get; set; }
    public string SmsStatus { get; set; }
    public string Body { get; set; }
    public string To { get; set; }
    public string ToZip { get; set; }
    public int NumSegments { get; set; }
    public int ReferralNumMedia { get; set; }
    public string MessageSid { get; set; }
    public string AccountSid { get; set; }
    public string From { get; set; }
}

方案2:使用Twilio官方SDK(生产环境推荐)

直接安装Twilio官方NuGet包,内置所有Webhook字段的强类型定义,同时自带请求签名验证能力(防止伪造请求攻击),如果是ASP.NET/ASP.NET Core项目,配置对应模型绑定器后可以直接把请求绑定到强类型对象,不需要手动解析字符串。

注意事项

  • 不要尝试用JSON反序列化工具处理该字符串,格式不匹配会直接报错
  • 生产环境必须校验Twilio请求签名,避免恶意请求伪造短信推送
  • 你提供的样例字符串存在字段截断问题,调试时建议先打印接收到的原始完整内容,确认所有字段完整后再做解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:01:13