如何在 ASP.NET 中接收 Twilio Video 的视频通话事件

How to receive video call events in ASP.NET for Twilio Video

我正在为使用 Twilio 的视频通话的状态回调创建一个 webhook。问题是我想过滤发生的事件,以便我可以使用该信息做一些其他事情。创建视频通话时如何接收这些事件?

在 ASP.NET Core 中,您可以使用 MVCMinimal APIs(端点)处理 webhook。


MVC 控制器能够将表单参数绑定到 strongly-typed object 参数(也称为模型绑定)或简单参数。

这是一个控制器,它将表单参数绑定到 RoomStatusRequest 的实例,然后记录它的一些属性:

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();
    }
}

您可以在项目的任何位置创建 RoomStatusRequest 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 属性。 这个class不是all-encompassing绑定所有状态事件属性

或者,您可以让 MVC 绑定到像这样的简单参数:

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();
    }
}

无论您将 StatusCallbackMethod 配置为 POST 还是 GET,MVC 都会从 绑定它表单参数分别查询字符串参数


对于最小 API(端点),您可以为 POST 请求接受这样的参数:

app.MapPost("/minimal/room/status", async (HttpRequest request) =>
{
    var form = await request.ReadFormAsync();

    var roomName = form["RoomName"];
    var roomSid = form["RoomSid"];
    var roomStatus = form["RoomStatus"];
    var roomType = form["RoomType"];
    app.Logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
        roomName,
        roomSid,
        roomStatus,
        roomType
    );

    return Results.Ok();
});

从请求中获取表单,然后使用字符串索引检索各个参数。

对于 GET 请求:

app.MapGet("/minimal/room/status", (
    [FromQuery] string roomName,
    [FromQuery] string roomSid,
    [FromQuery] string roomStatus,
    [FromQuery] string roomType
) =>
{
    app.Logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
        roomName,
        roomSid,
        roomStatus,
        roomType
    );

    return Results.Ok();
});

app.Run();

您可以像在 MVC 中一样使用单独的参数绑定。您不需要指定 [FromQuery] 但我喜欢这样做。如果你不使用 [FromQuery],ASP.NET 也会查看路由值,headers,以及更多绑定到你的参数。

对于上面的所有示例,参数和 属性 名称必须与表单参数中的名称匹配,尽管您可以使用某些属性来更改它,但我建议研究 MVC Model Binding and Minimal API Parameter Binding 了解更多信息。

您可以找到 source code for these samples and a sample to create the video room in this GitHub repository.