【问题标题】:Twilio: Put a call on hold in warm-transferTwilio:在暖转接中保持通话
【发布时间】:2019-03-13 15:51:48
【问题描述】:

我正在 Twilio 建议的应用中实现 warm-transfer
我需要所有这些功能如下:
https://www.twilio.com/docs/voice/tutorials/warm-transfer

我从 Github 下载了这个示例来检查这种方法是否合适:
https://github.com/TwilioDevEd/warm-transfer-csharp

现在我面临的问题是,当第一个代理呼叫第二个代理并告诉他们呼叫者的问题并挂断自己(即第一个代理)时,我不能让第一个呼叫者听一些音乐。

我在示例代码中添加了这段代码来暂停调用者:

public async Task<ActionResult> CallAgent2(string agentId)
    {
        var call = await _callsRepository.FindByAgentIdAsync(agentId);
        var participant = ParticipantResource.Update(
            pathConferenceSid: call.ConferenceId,
            pathCallSid: call.ConferenceId,
            hold: true,
            holdUrl: new System.Uri("http://twimlets.com/holdmusic?Bucket=com.twilio.music.classical")
        );

        var callBackUrl = GetConnectConfereceUrlForAgent(agentId, call.ConferenceId);
        _callCreator.CallAgent("agent2", callBackUrl);
        return new EmptyResult();
    }

但我收到了 Twilio 的“错误 20404”错误。
请让我知道如何实现这一点,或者我是否可以使用其他更好的方法来满足我的要求。

【问题讨论】:

  • A 20404 是缺少的资源(本质上是 404)。当您需要 pathCallSid 参数的呼叫 sid 时,您可能会使用两次会议 ID。
  • 是的,在示例代码中就是这样做的。实际上,当第一个电话进来时,它的 callSid 就变成了 ConferenceSid。我试图给 ConferenceSid 一个随机名称并使用该随机名称访问 ParticipantResource.Fetch 函数,但仍然是同样的问题。

标签: twilio twilio-api twilio-programmable-voice


【解决方案1】:

这里是 Twilio 开发者宣传员。

您收到 20404 错误,因为您试图通过将会议 SID 作为需要呼叫 SID 的参数传递来引用不存在的资源。

会议和通话是不同的资源,这就是为什么要引用会议中的参与者需要会议 SID 和参与者的通话 SID。

您有 Call SID,它被混淆地称为会议 ID,但这是因为它在创建 TwiML 以将某人拨入会议时用作友好名称。

由于是友好名称,这意味着我们可以通过友好名称过滤来查找会议。

var conferences = ConferenceResource.Read(
    friendlyName: conferenceId,
    status: ConferenceResource.StatusEnum.InProgress
);

这将返回友好名称与呼叫 SID 相同的所有正在进行的会议。这将是最多一次会议。然后,您可以使用会议 SID 以及呼叫 SID 来更新参与者。试试这样的:

public async Task<ActionResult> CallAgent2(string agentId)
{
    var call = await _callsRepository.FindByAgentIdAsync(agentId);
    var conferences = ConferenceResource.Read(
        friendlyName: conferenceId,
        status: ConferenceResource.StatusEnum.InProgress
    );
    var conference = conferences[0];
    var participant = ParticipantResource.Update(
        pathConferenceSid: conference.Sid,
        pathCallSid: call.ConferenceId,
        hold: true,
        holdUrl: new System.Uri("http://twimlets.com/holdmusic?Bucket=com.twilio.music.classical")
    );

    var callBackUrl = GetConnectConfereceUrlForAgent(agentId, call.ConferenceId);
    _callCreator.CallAgent("agent2", callBackUrl);
    return new EmptyResult();
}

【讨论】:

  • 模型中给出的ID是表中的主键,作为整数不起作用。我不确定如何获得 pathConferenceSid。我猜 pathConferenceSid 是从 Twilio 生成的,因为当代理使用以下方法加入新会议时:new Dial().Conference("xyz", waitUrl: new System.Uri(waitUrl)); 当我正在使用:ParticipantResource.Fetch("xyz", call.SiD) 访问给我同样的 20404 错误。这里的xyz是我随便起的名字。
  • 哦,你是对的。我们永远不会得到会议 SID,只有呼叫 SID。我用不同的想法更新了我的答案。
  • 完美!这就是我一直在寻找的。它现在正在工作。
  • 太棒了!很高兴我能帮忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多