Twilio C# ASP.NET Core Web API中recordingStatusCallback返回400错误排查
解决RecordingStatusCallback返回400的问题
以下是针对你遇到的问题的排查和解决步骤:
1. 检查模型绑定是否失败
你的Events方法正常,但Recordings返回400,大概率是模型绑定错误。Twilio发送的表单字段可能和你的VoiceRequest类属性不匹配,或者类型不兼容。
修改Recordings方法,添加模型状态校验,输出绑定错误:
[HttpPost] public IActionResult Recordings([FromForm] VoiceRequest request) { if (!ModelState.IsValid) { // 输出所有绑定错误,定位字段问题 foreach (var key in ModelState.Keys) { var errors = ModelState[key].Errors; foreach (var error in errors) { Console.WriteLine($"绑定错误 [{key}]: {error.ErrorMessage}"); } } return Ok(); // 先返回200,避免Twilio重复重试 } // 原有业务代码 Console.WriteLine($"CallSID: {request.CallSid}"); Console.WriteLine($"RecordingUrl: {request.RecordingUrl}"); Console.WriteLine($"RecordingDuration: {request.RecordingDuration}"); Console.WriteLine($"TranscriptionUrl: {request.TranscriptionUrl}"); return Ok(); }
2. 核对VoiceRequest类的字段定义
重点检查以下字段的名称和类型:
RecordingUrl:Twilio传递的字段名是RecordingUrl(注意大小写),你的属性名必须完全匹配;类型应为string。RecordingDuration:Twilio传递的是字符串格式的时长(比如"120"),如果你的属性定义为int,会导致绑定失败,需改为string,之后再转成数值类型。TranscriptionUrl:只有开启了转录功能时Twilio才会传递这个字段,若你的属性是必填项,也会导致绑定失败,需设置为可空(string?)。
示例正确的VoiceRequest字段定义:
public class VoiceRequest { public string CallSid { get; set; } public string CallStatus { get; set; } public string DialCallDuration { get; set; } public string RecordingUrl { get; set; } public string RecordingDuration { get; set; } public string? TranscriptionUrl { get; set; } // 可空,避免无转录时绑定失败 }
3. 确认方法返回值类型
原方法用void,ASP.NET默认返回204 No Content,虽然Twilio理论上接受,但改为返回IActionResult并明确返回Ok(),确保响应符合Twilio的预期。
4. 检查Twilio回调配置
- 确认
recordingStatusCallback的URL和statusCallback的URL在同一环境(比如都是ngrok代理的地址),没有路径拼写错误。 - 确认
recordingStatusCallbackEvent设置正确(比如设置为completed,只有录音完成时才会触发回调)。
内容的提问来源于stack exchange,提问作者punsandguns
相关产品推荐
相关产品推荐

