目前我在Twilio中使用测试帐户,但我希望这与我的问题无关。
作为迈向Twilio的第一步,我正在Windows上的Visual Studio 2017上测试client-quickstart-csharp-1.4程序包。
拨出电话在经过验证的电话上可以正常使用,但是拨入电话有问题。 当我从真实电话拨打我的Twilio电话号码时,VoiceController.cs中的代码无法运行(不会遇到任何断点),并且我听到一条语音消息,提示我应该重新配置应用程序(但是我不明白,什么)。与此相反,当我从TwiMLApp配置页面拨打电话时,按下红色的“通话”按钮(见图),
然后我的代码在断点处停止,并说出我在response.Say()
的自变量中编写的文本。
我的问题:
备注1。
使用Twilio小部件进行语音通话,在Agile CRM中,两个拨出电话都可以正常工作。但是在我进行实验时,我已经删除了此小部件(以及Twilio的“ Agile CRM Twilio Saga” TwiML App),以避免不同应用程序之间的干扰。
备注2。
也许我应该在此屏幕上进行一些配置(屏幕快照找到here),但在twilio门户上找不到该页面。
相反,我有一个这样的页面:
但是我不知道要在这里进行什么更改才能使程序正常工作。
答案 0 :(得分:0)
该应用程序似乎是设计的
每个(传出或传入)调用都属于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。可以分为以下两个部分:
calledUser
)建立真正的联系,而不是读出“谢谢!”消息,我们应该将response.Say("Thanks for calling!");
替换为response.Dial(cl, new { request.From });
,其中cl = new Client(calledUser);
可以将calledUser
的值放入Local.config中,这样我们就可以从那里读取它:{{1 }} 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();
}
}