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");
}
}