如何读取来自 twilio webhook 的事件?

How to read events that come from twilio webhook?

我正在 twilio 上创建一个视频室,并且我创建了一个 webhook 端点到 twilio 发送事件的地方。一个问题是我不知道如何读取这些事件,因为关于状态回调的 twilio 文档没有任何关于它实际如何工作的示例。

读取该数据的最佳方式是什么,因为我的端点看起来像这样

Public async Task<IActionResult> statuscallbackwebhook(){
//read data that is recieved from twilio
}

为了对此进行测试,我创建了一个 console app to create rooms for Twilio Video,您可以在其中指定 statusCallback:

using Twilio;
using Twilio.Rest.Video.V1;
using HttpMethod = Twilio.Http.HttpMethod;

// make sure to configure your Twilio Account SID and Auth Token as environment variables before running this program
var accountSid = Environment.GetEnvironmentVariable("TwilioAccountSid");
var authToken = Environment.GetEnvironmentVariable("TwilioAuthToken");

TwilioClient.Init(accountSid, authToken);

Console.Write("What is the room status callback URL?");
var roomStatusCallbackUrl = Console.ReadLine();
Console.WriteLine();

await RoomResource.CreateAsync(
    statusCallback: new Uri(roomStatusCallbackUrl), 
    statusCallbackMethod: HttpMethod.Post
);

无论您以何种方式创建房间,请务必将 statusCallback 配置为与您的 controller-action.

相匹配的路线

然后在您的控制器操作中,您可以通过两种方式接受 webhook 参数:使用 strongly-typed 对象作为参数,或者使用像 stringint 这样的简单类型参数, DateTime, 等等

如果要将 webhook 请求参数绑定到 strongly-typed 对象,请使用以下代码:

using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;

namespace RoomStatusCallback.Controllers;

public class RoomController : Controller
{
    private readonly ILogger<RoomController> logger;

    public RoomController(ILogger<RoomController> logger)
    {
        this.logger = logger;
    }

    public ActionResult Status(RoomStatusRequest statusRequest)
    {
        logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
            statusRequest.RoomName,
            statusRequest.RoomSid,
            statusRequest.RoomStatus,
            statusRequest.RoomType
        );
        return Ok();
    }
}

然后添加 class,它定义了 strongly-typed 对象的属性,这些属性必须将名称与 webhook 请求参数的名称相匹配。 webhook request parameters for video room status are documented here。这是我为 room-created 状态获取数据而创建的 class:

namespace RoomStatusCallback.Models;

public class RoomStatusRequest
{
    public string AccountSid { get; set; }
    public string RoomName { get; set; }
    public string RoomSid { get; set; }
    public string RoomStatus { get; set; }
    public string RoomType { get; set; }
    public string StatusCallbackEvent { get; set; }
    public DateTime Timestamp { get; set; }
}

您可以根据应用程序的需要随意 add/remove 属性。 ASP.NET Core MVC's model binding 会将 webhook 请求参数绑定到 strongly-typed 对象的属性。

第二种方法是使用像这样的简单类型参数:

using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;

namespace RoomStatusCallback.Controllers;

public class RoomController : Controller
{
    private readonly ILogger<RoomController> logger;

    public RoomController(ILogger<RoomController> logger)
    {
        this.logger = logger;
    }

    public ActionResult Status(
        string roomName,
        string roomSid,
        string roomStatus,
        string roomType
    )
    {
        logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
            roomName,
            roomSid,
            roomStatus,
            roomType
        );
        return Ok();
    }
}

结果是完全一样的,但是通过给动作添加参数,ASP.NETCore的绑定特性会将webhook请求参数绑定到动作的参数上,只要它们匹配名称。

要使用 the sample 进行测试:

  1. 启动包含您的 webhook 的 ASP.NET 核心项目
  2. 启动ngrok隧道服务
  3. 运行 控制台应用程序并传入 public ngrok 转发 URL + 到您的 controller-action.
  4. 的路由

还有更多方法可以做到这一点,但是对于 MVC controller-actions,这两个选项将是推荐的方法。