在Twilio'中接收真正的来电;s客户端快速启动
目前,我在Twilio中使用了一个测试帐户,但我希望这与我的问题无关 作为我迈向Twilio的第一步,我正在Windows上的Visual Studio 2017上测试该软件包 拨出的电话对我的验证过的手机很好,但我的拨入电话有问题。当我从一部真正的手机打电话给我的Twilio phonenumber时,我在VoiceController.cs中的代码没有运行(没有命中任何断点),我听到一条语音消息,说我应该重新配置我的应用程序(但我不明白,是什么)。与此相反,当我从TwiMLApp配置页面拨打电话时,按下红色呼叫按钮(见图) 然后,我的代码在断点处停止,并显示我在在Twilio'中接收真正的来电;s客户端快速启动,twilio,Twilio,目前,我在Twilio中使用了一个测试帐户,但我希望这与我的问题无关 作为我迈向Twilio的第一步,我正在Windows上的Visual Studio 2017上测试该软件包 拨出的电话对我的验证过的手机很好,但我的拨入电话有问题。当我从一部真正的手机打电话给我的Twilio phonenumber时,我在VoiceController.cs中的代码没有运行(没有命中任何断点),我听到一条语音消息,说我应该重新配置我的应用程序(但我不明白,是什么)。与此相反,当我从TwiMLApp配置页面拨打
response.Say()的参数中编写的文本
我的问题是:
为什么这个电话的工作原理与真正的手机不同,而与我的手机不同
TwiMLApp配置页面
当我从一部真正的手机打电话时,我如何实现代码运行(即说我在代码中写的文字)
如何在来电时在呼叫者电话和我的计算机扬声器和麦克风之间实现真实、实时的语音对话(类似于
拨出的电话是多少
备注1
在使用Twilio小部件进行语音通话的敏捷CRM中,传出和传入呼叫都可以正常工作。但在我的实验中,我已经删除了这个小部件(以及Twilio中的“AgilecrmTwilioSaga”TwiML应用程序),以避免不同应用程序之间的干扰
备注2
也许我应该用这个屏幕(找到的屏幕截图)配置一些东西,但是我在我的twilio门户上找不到这个页面
与此相反,我有这样一个页面:
public ActionResult Index(VoiceRequest request)
{
var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];
var calledUser = ConfigurationManager.AppSettings["calledUser"];
var response = new TwilioResponse();
if (!string.IsNullOrEmpty(request.To))
{
// 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(request.To, "^[\\d\\+\\-\\(\\) ]+$"))
{
if (request.To != callerId) //(mma) supposed to be an outgoing call
{
response.Dial(new Number(request.To), new { callerId });
}
else //(mma) supposed to be an incoming call from a real phone
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
}
else //(mma) a call from one client to antorher
{
response.Dial(new Client(request.To), new { request.From });
}
}
else //(mma) incoming call from the TwiML App setting page
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
return TwiML(response);
}
public class HomeController : Controller
{
public ActionResult Index(string user)
{
TempData["User"] = user;
return View();
}
}
但我不知道要在这里更改什么才能使我的程序正常工作。这个应用程序似乎是专门设计的
- 管理传出呼叫(到真实电话,或到此系统的其他客户端)
应用程序)和
- 接受来自web的呼叫(来自另一个客户端,
或者从TwiML应用程序设置页面(见o.p.)的第一个屏幕截图),但不是从真正的手机
每个(传出或传入)呼叫都属于VoiceController
类的Index()方法。此方法尝试找出呼叫是传入的还是传出的
在拨出电话时,此方法的request
参数的To
属性是一个电话号码,而在从web拨出的电话中是一个字符串(用户名),或null(当电话来自TwiML应用程序设置页时)。这证明了原始代码中if-else结构的合理性(仅扩展了我以(mma)
开头的备注)
问题3。可分为以下两部分:
如果在来电时,我们希望与预先指定的客户端建立真正的连接(例如calledUser
),而不是读取“感谢来电!”消息,我们应该替换响应。例如(“感谢来电!”)
byresponse.Dial(cl,new{request.From})代码>其中cl=新客户机(calledUser)
我们可以将calledUser
的值放入我们的Local.config,这样我们就可以从那里读取它:var calledUser=ConfigurationManager.AppSettings[“calledUser”]代码>
如果我们想接受来自真实电话的呼叫,那么我们应该认识到这种情况。这正是request.To==callerId
(=我们的Twilio音标号)的时间,因此我们必须根据此条件拆分第一个条件。新分支将调用预先指定的用户李>
把这些放在一起,我们在VoiceController.cs
中的新代码将如下所示:
public ActionResult Index(VoiceRequest request)
{
var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];
var calledUser = ConfigurationManager.AppSettings["calledUser"];
var response = new TwilioResponse();
if (!string.IsNullOrEmpty(request.To))
{
// 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(request.To, "^[\\d\\+\\-\\(\\) ]+$"))
{
if (request.To != callerId) //(mma) supposed to be an outgoing call
{
response.Dial(new Number(request.To), new { callerId });
}
else //(mma) supposed to be an incoming call from a real phone
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
}
else //(mma) a call from one client to antorher
{
response.Dial(new Client(request.To), new { request.From });
}
}
else //(mma) incoming call from the TwiML App setting page
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
return TwiML(response);
}
public class HomeController : Controller
{
public ActionResult Index(string user)
{
TempData["User"] = user;
return View();
}
}
当然,如果我们想要接受一个呼叫,那么我们应该使用预定义的用户名(calledUser
)启动一个客户端。为此,我们可以引入一个新的Url参数User
,通过HomeController
将其值放入TempData[“User”]
,并更改var identity=Internet.UserName().AlphanumericOnly()代码>在TokenController.cs
到var identity=TempData[“User”]==null的代码行?Internet.UserName().AlphanumericOnly():TempData[“User”].ToString()代码>
因此,我们的新HomeController和TokenController如下所示:
public ActionResult Index(VoiceRequest request)
{
var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];
var calledUser = ConfigurationManager.AppSettings["calledUser"];
var response = new TwilioResponse();
if (!string.IsNullOrEmpty(request.To))
{
// 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(request.To, "^[\\d\\+\\-\\(\\) ]+$"))
{
if (request.To != callerId) //(mma) supposed to be an outgoing call
{
response.Dial(new Number(request.To), new { callerId });
}
else //(mma) supposed to be an incoming call from a real phone
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
}
else //(mma) a call from one client to antorher
{
response.Dial(new Client(request.To), new { request.From });
}
}
else //(mma) incoming call from the TwiML App setting page
{
var cl = new Client(calledUser);
response.Dial(cl, new { request.From });
}
return TwiML(response);
}
public class HomeController : Controller
{
public ActionResult Index(string user)
{
TempData["User"] = user;
return View();
}
}
这是:
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 = TempData["User"] == null ? Internet.UserName().AlphanumericOnly() : TempData["User"].ToString();
// Create an Access Token generator
var capability = new TwilioCapability(accountSid, authToken);
capability.AllowClientOutgoing(appSid);
capability.AllowClientIncoming(identity);
var token = capability.GenerateToken();
return Json(new
{
identity,
token
}, JsonRequestBehavior.AllowGet);
}
}
当然,我们的Local.config文件应该包含这样一行:
<add key="calledUser" value="TheNameOfThePreDefinedUser" />
今天,问题1(因此也是问题2)已经消失。我什么也没做,只是把TWiML应用程序切换到了“Agile CRM Twilio Saga”,然后在上一个屏幕截图的页面上再次切换到“TWiML应用程序1 MMA”。现在,从真实手机拨打电话和从图1所示页面拨打电话的唯一区别是,在第一种情况下,“request.To”包含我的Twilio号码,而在后一种情况下,它是空的。Twilio支持部门给了我一个提示。据称,我的第三个问题的解决方案可以在这里找到:。我会尽快检查。但是,唉,现在我还有其他事情要做。