Twilio - 使用 C# 获取传入的 phone 号码

Twilio - Get the incoming phone number with C#

在我的 C# asp.net 核心网络 api 项目中,我使用网络钩子从我的 Twilio phone 号码捕获传入的语音呼叫。除了处理电话外,我还想通过电子邮件通知管理员来电。为此,我需要获取传入的 phone 号码。我该怎么做?

这是我的代码:

[HttpPost("incomingVoice")]
public async Task<IActionResult> IncomingVoice(string digits)
{
    var response = new VoiceResponse();

    if (!string.IsNullOrEmpty(digits))
    {
        ... Handle the user selection
    }

    response.Append(new Gather(numDigits: 1).Say("Welcome to ...! For sales, press 1. For marketing, press 2. For support press 3", voice: "alice", language: "en-GB"));

    //handle the lack of response
    response.Say("Please leave a message after the tone.  Hang up when finished.", voice: "alice", language: "en-GB");
    response.Record();
    response.Hangup();

    string phoneNumber = <??? INCOMING PHONE NUMBER ???>

    IRestResponse mgresp = await SendMGMessage(phoneNumber);

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

谢谢。

经过一番挖掘,我发现了这个 link:https://www.twilio.com/docs/api/twiml/twilio_request

其中规定了TwiML请求包含的参数种类繁多。从那里我能够将 phone 号码提取为:

string phoneNumber = Request.Form["From"];

希望能为您节省一些研究时间。

除了 之外,您还可以像这样打印出所有可用值...

[HttpGet]
public TwiMLResult Welcome()
{
  var lst = Request.QueryString.AllKeys
    .Select(key => new {Name = key.ToString(), Value = Request.QueryString[key.ToString()]})
    .ToArray();
  foreach (var v in lst)
  {
    _logger.Info(JsonConvert.SerializeObject(v, Formatting.Indented));
  }
  ...
}

NLog 示例输出:

2019-05-07 17:00:36.7601|INFO|TwilioMvcDemo.Controllers.IvrController|{
  "Called": "+15555555555",
  "ToState": "CA",
  "CallerCountry": "US",
  "Direction": "inbound",
  "ApiVersion": "2010-04-01",
  "CallStatus": "ringing",
  "From": "+15555554444",
  "AccountSid": "CdEf567",
  "CalledCountry": "US",
  "CallerCity": "MARS OUTPOST",
  ...
}

我遇到了类似的问题,但我正在尝试使用带有 .NET 6 的 Minimal Web API 来解决这个问题。

Twilio 有这个很棒的教程:

https://www.twilio.com/blog/sms-voice-dotnet-6-minimal-api

但它没有回答如何从 webhook 内部访问传入的 phone 号码。

我不确定如何将 Microsoft.AspNetCore.HttpRequest 对象转换为首选的 Twilio.AspNet.Common.SmsRequest 对象。

以下代码似乎有效,但欢迎提出更好方法的建议。

//app.MapPost("/smshandler", (SmsRequest incomingMessage) => SmsHandler(incomingMessage));  // does not work
app.MapPost("/smshandler", (HttpRequest request) => SmsHandler(request));

private static IResult SmsHandler(HttpRequest request)
    {
        try
        {
            string from = request.Form["From"];
            string body = request.Form["Body"];

            DoWork(from, body);
            return Results.Ok();
        }
        catch (Exception ex)
        {
            return Results.Problem(ex.Message);
        }
    }