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
相关产品推荐
相关产品推荐

