在Twilio的ClientQuickstart中接听真实来电

时间:2018-08-14 12:18:14

标签: twilio

目前我在Twilio中使用测试帐户,但我希望这与我的问题无关。

作为迈向Twilio的第一步,我正在Windows上的Visual Studio 2017上测试client-quickstart-csharp-1.4程序包。

拨出电话在经过验证的电话上可以正常使用,但是拨入电话有问题。 当我从真实电话拨打我的Twilio电话号码时,VoiceController.cs中的代码无法运行(不会遇到任何断点),并且我听到一条语音消息,提示我应该重新配置应用程序(但是我不明白,什么)。与此相反,当我从TwiMLApp配置页面拨打电话时,按下红色的“通话”按钮(见图),

enter image description here

然后我的代码在断点处停止,并说出我在response.Say()的自变量中编写的文本。

我的问题:

  1. 为什么通话与真实电话的工作方式不同,为什么与我的电话不同 TwiMLApp配置页面?
  2. 当我从真实电话拨打电话时,如何实现我的代码运行(即说我在代码中编写的文本)?
  3. 在来电时如何在呼叫方电话与计算机的扬声器和麦克风之间实现真实,实时的语音对话(类似于 拨出电话)?

备注1。

使用Twilio小部件进行语音通话,在Agile CRM中,两个拨出电话都可以正常工作。但是在我进行实验时,我已经删除了此小部件(以及Twilio的“ Agile CRM Twilio Saga” TwiML App),以避免不同应用程序之间的干扰。

备注2。

也许我应该在此屏幕上进行一些配置(屏幕快照找到here),但在twilio门户上找不到该页面。

enter image description here

相反,我有一个这样的页面:

enter image description here

但是我不知道要在这里进行什么更改才能使程序正常工作。

1 个答案:

答案 0 :(得分:0)

该应用程序似乎是设计的

  • 管理拨出电话(到真实电话或与此相关的其他客户端 应用程序)和
  • 接受来自网络的呼叫(来自另一个客户端, 或从TwiML App设置页面上看到,而不是在真实手机上看到。

每个(传出或传入)调用都属于VoiceController类的Index()方法。此方法尝试找出呼叫是呼入还是呼出。

在拨出电话的情况下,此方法的To参数的request属性是电话号码,而在网络上的传入呼叫中是字符串(用户名),或者空(当呼叫来自TwiML App设置页面时)。这证明了原始代码中的if-else结构是正确的(仅扩展了我的(mma)开头的注释)

public ActionResult Index(VoiceRequest request)
{
  var callerId = ConfigurationManager.AppSettings["TwilioCallerId"];

  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\\+\\-\\(\\) ]+$")) //(mma) supposed to be an outgoing call
    {
      response.Dial(new Number(request.To), new { callerId });
    }
    else //(mma) a call from one client to antorher
    {
      response.Dial(new Client(request.To), new { callerId }); 
    }
  }
  else //(mma) incoming call from the TwiML App setting page
  {
    response.Say("Thanks for calling!");
  }
  return TwiML(response);

问题3。可以分为以下两个部分:

  1. 如果在来电时,我们想与预先指定的客户(例如calledUser)建立真正的联系,而不是读出“谢谢!”消息,我们应该将response.Say("Thanks for calling!");替换为response.Dial(cl, new { request.From });,其中cl = new Client(calledUser);可以将calledUser的值放入Local.config中,这样我们就可以从那里读取它:{{1 }}
  2. 如果我们要接受来自真实电话的呼叫,那么我们应该意识到这种情况。这正是var calledUser = ConfigurationManager.AppSettings["calledUser"];(=我们的Twilio语音编号)的时间,因此我们必须根据此拆分第一个条件。新分支将呼叫预先指定的用户。

将它们放在一起,我们在request.To == callerId中的新代码将如下所示:

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); } )启动客户端。为此,我们可以引入一个新的Url参数calledUser,将其值由User放入TempData["User"]并更改{{1}中的HomeController行}到var identity = Internet.UserName().AlphanumericOnly();

因此,我们新的HomeController和TokenController如下所示:

TokenController.cs

这:

var identity = TempData["User"] == null ? Internet.UserName().AlphanumericOnly()  : TempData["User"].ToString();

当然,我们的Local.config文件应包含以下行:

  public class HomeController : Controller
  {
    public ActionResult Index(string user)
    {
            TempData["User"] = user;
      return View();
    }
  }