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

Twilio呼入语音Webhook重复触发问题排查求助

排查Twilio呼入Webhook重复触发问题

针对你遇到的Azure Function(Python)作为Twilio呼入Webhook时被重复触发、导致语音重复播放的问题,结合你的场景和代码,我整理了几个关键排查方向和解决方案:

1. 响应的Content-Type未正确设置(最可能的原因)

Twilio要求Webhook返回的TwiML必须带有application/xml的Content-Type头。你的代码当前仅返回XML字符串,但未指定Content-Type,这会导致Twilio无法正确识别响应格式,误以为请求失败,进而触发重试逻辑。

修改你的函数返回语句,添加content_type参数:

return func.HttpResponse(str(response), status_code=200, content_type='application/xml')

2. Azure Function冷启动延迟导致Twilio超时重试

Twilio默认等待Webhook响应的超时时间为15秒。如果你的Azure Function使用Consumption计划,冷启动(首次触发或长时间未触发后的启动)可能会超过这个时限,Twilio会判定请求失败并发起第二次调用。

解决方法:

  • 切换到Azure Function的Premium/Elastic Premium计划,这类计划提供始终预热的实例,避免冷启动延迟
  • 若保留Consumption计划,可配置预热触发器(比如定时触发),让函数保持活跃状态

3. Play标签的参数使用不规范

你代码中的response.play('', digits='wwww#')传入了空字符串作为音频URL参数,虽然Twilio可能兼容这种写法,但不规范的参数可能引发解析异常。可以简化为直接传入digits参数:

response.play(digits='wwww#')

修改后的完整代码示例:

import logging
from twilio.twiml.voice_response import Say, Play, VoiceResponse
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    response = VoiceResponse()
    response.say('hello this is test bots')
    response.play(digits='wwww#')
    return func.HttpResponse(str(response), status_code=200, content_type='application/xml')

验证建议

完成修改后,先通过浏览器访问Azure Function的触发URL,检查响应头中是否包含Content-Type: application/xml;再拨打Twilio号码测试重复播放的问题是否消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:47:49