问题描述
给定发出传出呼叫的客户端代码,如下所示:
var accountSid = configuration["accountSid"];
var authToken = configuration["authToken"];
TwilioClient.Init(accountSid, authToken);
var call = CallResource.Create(
machineDetection: "DetectMessageEnd",
asyncAmd: "true",
asyncAmdStatusCallback: new Uri("[URL]/callback/index"),
asyncAmdStatusCallbackMethod: HttpMethod.Post,
twiml: new Twilio.Types.Twiml("<Response><Say>Ahoy there!</Say></Response>"),
from: new Twilio.Types.PhoneNumber(configuration["fromPhoneNumber"]),
to: new Twilio.Types.PhoneNumber(configuration["toPhoneNumber"])
);
又名,启用了asyncAmd并指定了回调URL,我的WebHook控制器操作如下所示:
[ApiController]
[Route("callback")]
public class CallbackController : TwilioController
{
[HttpPost]
[Route("index")]
public IActionResult Index()
{
var response = new VoiceResponse();
if (Request.Form.TryGetValue("AnsweredBy", out var answeredBy))
{
if (answeredBy != "human")
{
response.Say("this is the voice message");
}
}
return Content(response.ToString(), "text/xml");
}
}
为什么没有留下语音邮件?
注意:我在CallResource.Create
b/c中包含了我要说的Twiml,我不希望在人工应答时通过回调来获取消息内容。
我只需要对AMD检测结果进行回调,然后留言。
我这样做有回应吗?你说呢?
谢谢!
推荐答案
Twilio Developer传教士此处。
Twilio应答机检测可以同步或异步模式进行。发件人this blog post:在Twilio上使用异步AMD时,AMD是异步执行的(由此得名)。当呼叫被应答时,呼叫url会立即执行,因此,如果有人应答呼叫而不是语音邮件,他们可以开始与您的应用程序交互,而不会有任何沉默。然后,AMD"异步地"或"并行地"处理呼叫音频,并确定是什么人应答了呼叫。AMD处理完成后,结果(
AnsweredBy
参数)将发送到第二个URL,即asyncAmdStatusCallback
。标准AMD和异步AMD之间的一个关键区别是在收到AMD结果后如何修改调用。使用标准AMD,您有一个URL,结果将像任何其他出站API调用一样发送到此URL。当您的URL收到结果时,您可以检查
AnsweredBy
参数并使用TwiML相应地更新调用。使用异步AMD时,您的调用已经在执行TwiML,您需要通过API更新该调用。
在您的情况下,您使用的是异步AMD,但您没有通过API更新调用。
您有两个选择。您可以选择使用同步AMD,然后可以像目前一样使用TwiML响应结果。
或者,您也可以继续使用异步AMD,但不使用TwiML响应WebHook,而是use the REST API to update the call with the new TwiML or with a new webhook URL。
有一件事我也会留心。您的初始TwiML非常短,示例代码显示它发送<Response><Say>Ahoy there!</Say></Response>
。该TwiML完全有可能在检测到应答机之前完成,并且由于它是用于该呼叫的唯一TwiML,因此该呼叫随后将被挂断。您可能需要考虑使用更长的消息或暂停,以便可以获得AMD结果。
这篇关于如何使用Twilio AMD留下语音信箱?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!