Twilio MVC项目正在接收调用,但它从未到达javascript客户端

Twilio MVC项目正在接收调用,但它从未到达javascript客户端,javascript,c#,twilio,Javascript,C#,Twilio,我正在尝试使用Twilio服务进行概念验证。我从GitHub下载了示例C#项目,可以在这里找到: 有了这个解决方案,我就可以(用我的个人手机)拨打出站电话,并来回通话 现在,我正在尝试测试来电,但这不起作用 在示例项目中,/voice端点用于传入和传出呼叫。当我从我的个人手机呼叫我的Twilio手机时,/voice端点被正确命中。但不管我做什么,电话都断开了。另外,javascript客户端中的Twilio.Device.incoming()函数,永远不会被触发 如何接收在我的/语音端点接收到的

我正在尝试使用
Twilio
服务进行概念验证。我从
GitHub
下载了示例
C#
项目,可以在这里找到:

有了这个解决方案,我就可以(用我的个人手机)拨打出站电话,并来回通话

现在,我正在尝试测试来电,但这不起作用

在示例项目中,/voice端点用于传入和传出呼叫。当我从我的个人手机呼叫我的
Twilio
手机时,/voice端点被正确命中。但不管我做什么,电话都断开了。另外,
javascript
客户端中的Twilio.Device.incoming()
函数
,永远不会被触发

如何接收在我的/语音端点接收到的来电,并将其转发到正在运行的
javascript
客户端,以便我能够与呼叫电话来回通话

这是VoiceController,我的手机做了一些轻微的修改:

public class VoiceController : Controller
{
    [HttpPost]
    public ActionResult Index(string to)
    {
        var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];

        var response = new VoiceResponse();

        if (!string.IsNullOrEmpty(to) && !to.Contains("7898"))
        {
            var dial = new Dial(callerId: callerId);

            // wrap the phone number or client name in the appropriate TwiML verb
            // by checking if the number given has only digits and format symbols
            if (Regex.IsMatch(to, "^[\\d\\+\\-\\(\\) ]+$"))
            {
                dial.Number(to);
            }
            else
            {
                dial.Client(to);
            }

            response.Dial(dial);
        }
        else
        {
            var dial = new Dial(callerId: callerId);
            dial.Number("+15555557898");

            response
                .Say("Transferring your call to the Twilio client, Jose.")
                .Dial(dial);
        }

        return Content(response.ToString(), "text/xml");
    }
}
下面是
javascript
代码(直接来自项目中提供的quickstart.js;我删除了许多与此问题无关的其他函数):

编辑:回应@ADyson的评论/问题…

“Does.done()callback fire”:是的,运行示例应用程序时,会加载主页/索引页。在MVC代码中,$.getJSON(/token)被称为命中TokenController。它获取一个有效的令牌,并返回相关的JSON,以下是令牌控制器:

public class TokenController : Controller
{
    // GET: /token
    public ActionResult Index()
    {
        // Load Twilio configuration from Web.config
        var accountSid = ConfigurationManager.AppSettings["TwilioAccountSid"];
        var authToken = ConfigurationManager.AppSettings["TwilioAuthToken"];
        var appSid = ConfigurationManager.AppSettings["TwilioTwimlAppSid"];

        // Create a random identity for the client
        var identity = "Jose";

        // Create an Access Token generator
        var scopes = new HashSet<IScope>
        {
            { new IncomingClientScope(identity) },
            { new OutgoingClientScope(appSid) }
        };

        var capability = new ClientCapability(accountSid, authToken, scopes: scopes);
        var token = capability.ToJwt();

        return Json(new
        {
            identity,
            token
        }, JsonRequestBehavior.AllowGet);
    }
}
“Twilio.Device.connect()”调用Twilio的系统,获取进行调用的webhook url,即“https://{myngrokurl}.ngrok.io/voice”。这就是它击中我的语音/索引端点的方式,然后由该端点拨打电话。所有这些都非常有效(传出呼叫)

现在,对于传入呼叫,它们也被路由到语音/索引端点,正如在Twilio管理界面中配置的那样(传入和传出呼叫只有一个端点)。在上面的代码中,您可以看到,当传入呼叫到达这里时,它最终执行“response.Dial()”。这就是我假设它应该将调用路由到客户端javascript的地方;具体来说,它应该命中以下javascript代码:

  Twilio.Device.incoming(function (conn) {
    log('Incoming connection from ' + conn.parameters.From);
    var archEnemyPhoneNumber = '+12099517118';

    if (conn.parameters.From === archEnemyPhoneNumber) {
      conn.reject();
      log('It\'s your nemesis. Rejected call.');
    } else {
      // accept the incoming connection and start two-way audio
      conn.accept();
    }
  });
但这是不起作用的部分。传入呼叫成功命中语音/索引端点,但从未命中javascript Twilio.Device.incoming函数


希望有帮助

嗯,我已经取得了一些进展。我现在可以接电话了,但不是我想要的方式

我做了一个更改,检查传入呼叫(“to”)参数是否等于我的[Twilio]电话号码。如果是的话,我让它拨我的“客户”,“何塞”,而不是拨那个电话号码。当我这样做的时候,我现在能够接到电话并与来电者交谈

那么,所有这些东西都应该是这样工作的吗?如果来电应该是“我”,那么将其从电话号码改为“我的身份”

我会继续玩它

以下是迄今为止正在运行的代码的修改版本:

public class VoiceController : Controller
{
    [HttpPost]
    public ActionResult Index(string to)
    {
        var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];

        var response = new VoiceResponse();

        if (!string.IsNullOrEmpty(to))
        {
            var dial = new Dial(callerId: callerId);

            // wrap the phone number or client name in the appropriate TwiML verb
            // by checking if the number given has only digits and format symbols
            if (to.Contains(myPhoneNumber))
            {
                dial.Client("Jose"); // this works!
            }
            else if (Regex.IsMatch(to, "^[\\d\\+\\-\\(\\) ]+$"))
            {
                dial.Number(to);
            }
            else
            {
                dial.Client(to);
            }

            response.Dial(dial);
        }
        else
        {
            var dial = new Dial(callerId: callerId);
            dial.Number("+15555557898");

            response
                .Say("Transferring your call to the Twilio client, Jose.")
                .Dial(dial);
        }

        return Content(response.ToString(), "text/xml");
    }
}

我们是否理解“.done()”回调会触发,并且所有的Twilio处理程序都被正确执行以附加“就绪”和“传入”回调?在整个过程中,Javascript控制台中是否有任何错误或警告?还有,“Index()”控制器方法的相关性是什么?什么时候执行?您显示的JS调用了一个名为“Token()”的端点,但您没有显示该端点。@ADyson问题已更新,以尝试解决您的评论/问题谢谢。“这就是我假设它应该将调用路由到客户端javascript的地方;”。某种程度上。我相信它会向调用者发送一个XML响应,类似于下面的示例:。我想这意味着twilio会尝试拨打你的号码。您是否进行了所有设置以将您的开发环境与Twilio服务器绑定,设置了功能令牌等。顺便说一句,我不是twilio专家,这只是我从医生那里观察到的。你的代码看起来基本上没问题,我想…也可以看一下“传入”的文档,我猜你可能已经阅读了所有这些内容,但只是想让你知道我的评论是基于什么。
  Twilio.Device.incoming(function (conn) {
    log('Incoming connection from ' + conn.parameters.From);
    var archEnemyPhoneNumber = '+12099517118';

    if (conn.parameters.From === archEnemyPhoneNumber) {
      conn.reject();
      log('It\'s your nemesis. Rejected call.');
    } else {
      // accept the incoming connection and start two-way audio
      conn.accept();
    }
  });
public class VoiceController : Controller
{
    [HttpPost]
    public ActionResult Index(string to)
    {
        var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];

        var response = new VoiceResponse();

        if (!string.IsNullOrEmpty(to))
        {
            var dial = new Dial(callerId: callerId);

            // wrap the phone number or client name in the appropriate TwiML verb
            // by checking if the number given has only digits and format symbols
            if (to.Contains(myPhoneNumber))
            {
                dial.Client("Jose"); // this works!
            }
            else if (Regex.IsMatch(to, "^[\\d\\+\\-\\(\\) ]+$"))
            {
                dial.Number(to);
            }
            else
            {
                dial.Client(to);
            }

            response.Dial(dial);
        }
        else
        {
            var dial = new Dial(callerId: callerId);
            dial.Number("+15555557898");

            response
                .Say("Transferring your call to the Twilio client, Jose.")
                .Dial(dial);
        }

        return Content(response.ToString(), "text/xml");
    }
}