使用Twilio C# API发起通话后自动挂断,如何保持在线?
解决Twilio通话自动挂断问题
Twilio执行完所有TWIML指令后会自动挂断通话,要保持通话在线,你需要让TWIML逻辑持续运行,不让流程走到终点。以下是几种可行方案:
方案1:长暂停+循环重定向
创建一个公开可访问的TWIML端点(比如ASP.NET Core的API接口),返回包含长暂停和重定向的TWIML:
<Response> <Say>Ahoy there!</Say> <!-- 暂停1小时,可根据需求调整时长 --> <Pause length="3600"/> <!-- 重定向回当前端点,形成循环 --> <Redirect>https://your-public-server.com/api/twiml/keep-alive</Redirect> </Response>
然后修改C#代码,调用这个端点而非内嵌TWIML:
string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID"); string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN"); TwilioClient.Init(accountSid, authToken); var call = CallResource.Create( url: new Uri("https://your-public-server.com/api/twiml/keep-alive"), to: new Twilio.Types.PhoneNumber("+15558675310"), from: new Twilio.Types.PhoneNumber("+15552223214") ); Console.WriteLine(call.Sid);
方案2:用Gather等待用户输入
通过<Gather>设置超长超时,让通话持续等待用户操作,超时后重定向回自身:
<Response> <Say>Ahoy there! Stay on the line, or press any key to continue.</Say> <!-- 超时设为1小时,finishOnKey设为#(用户按#可触发action) --> <Gather timeout="3600" finishOnKey="#" action="/api/twiml/keep-alive"> <Say>Waiting for your input...</Say> </Gather> <!-- 超时后重定向,继续保持通话 --> <Redirect>/api/twiml/keep-alive</Redirect> </Response>
方案3:WebSocket流连接(进阶)
使用Twilio的<Stream>动词建立WebSocket连接,只要WebSocket连接保持活跃,通话就不会断开。这种方式需要后端维护WebSocket连接,适合需要实时交互的场景:
<Response> <Say>Ahoy there! Starting stream...</Say> <Stream url="wss://your-websocket-server.com/stream"/> </Response>
注意事项
- 长时间通话会产生相应的Twilio费用,需根据业务需求控制时长。
- 所有TWIML端点必须是公开可访问的HTTPS地址,Twilio无法调用本地未暴露的服务。
内容的提问来源于stack exchange,提问作者shrekDeep
相关产品推荐
相关产品推荐

