You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio任务路由回调处理:程序化接受预约及ASP.NET MVC多指令管理

Twilio TaskRouter 相关问题解答

问题1:reservation.created 触发后如何程序化接受预约?

当Twilio触发reservation.created事件时,你可以通过Twilio的REST API直接调用预约的Accept接口来完成程序化接受,具体操作步骤如下:

  • 第一步:提取关键参数
    在Twilio发送的回调请求中,会携带ReservationSid、TaskSid和WorkspaceSid这些核心参数,你可以从Request.Form(POST请求场景)中直接获取这些值。

  • 第二步:用Twilio SDK执行接受操作
    假设你用的是C#配合ASP.NET MVC,先确保已经安装了Twilio NuGet包,然后在回调处理方法中编写代码:

using Twilio;
using Twilio.Rest.Taskrouter.V1.Workspace.Reservation;

// 建议把账号信息放在配置文件中,不要硬编码
TwilioClient.Init(ConfigurationManager.AppSettings["TwilioAccountSid"], 
                  ConfigurationManager.AppSettings["TwilioAuthToken"]);

// 接受指定预约
var acceptedReservation = AcceptReservationResource.Create(
    pathWorkspaceSid: ConfigurationManager.AppSettings["TwilioWorkspaceSid"],
    pathTaskSid: Request.Form["TaskSid"],
    pathReservationSid: Request.Form["ReservationSid"]
);
  • 小提示
    • 处理回调时要注意幂等性,避免因网络重试导致重复接受预约
    • 你的服务器必须是公网可访问的HTTPS地址,否则Twilio无法触发回调

问题2:ASP.NET MVC单回调URL管理多指令 + 接受预约并呼叫Twilio Client

你的现有Assignment方法返回dequeue指令,这是Twilio默认的电话分配逻辑,但如果需要更灵活的控制(比如主动呼叫Twilio Client)或者在同一个URL处理不同TaskRouter事件,可以这样做:

1. 在单URL中区分不同事件

Twilio的所有回调请求都会携带EventName参数(比如reservation.created、assignment),你可以基于这个参数分支处理不同逻辑:

public ActionResult TaskRouterCallback()
{
    var eventName = Request.Form["EventName"];
    var reservationSid = Request.Form["ReservationSid"];
    var workspaceSid = ConfigurationManager.AppSettings["TwilioWorkspaceSid"];
    var taskSid = Request.Form["TaskSid"];

    switch(eventName)
    {
        case "reservation.created":
            // 处理预约创建:接受并呼叫Client
            HandleReservationCreated(reservationSid, workspaceSid, taskSid);
            return new EmptyResult();
        case "assignment":
            // 处理任务分配:返回自定义指令
            return ReturnAssignmentInstruction();
        default:
            // 忽略未处理的其他事件
            return new EmptyResult();
    }
}

2. 接受预约并呼叫Twilio Client的两种方案

方案一:修改Assignment响应为call指令(最简单)

如果你希望在任务分配时直接触发对Twilio Client的呼叫,不需要额外手动操作,可以修改Assignment方法返回call指令:

private JsonResult ReturnAssignmentInstruction()
{
    var assignmentResponse = new 
    { 
        instruction = "call",
        to = "client:你的Worker客户端名称", // 比如Worker登录用的Client ID
        from = "+1234567890", // 你的Twilio电话号码
        post_work_activity_sid = Singleton.Instance.PostWorkActivitySid
    };
    return new JsonResult() { Data = assignmentResponse };
}

这样Twilio会自动完成:接受预约 → 发起呼叫到指定Twilio Client → 连接到任务通话。

方案二:手动接受预约并发起呼叫(适合复杂逻辑)

如果需要先做自定义校验(比如检查Worker是否在线)再发起呼叫,可以分开两步操作:

private void HandleReservationCreated(string reservationSid, string workspaceSid, string taskSid)
{
    // 1. 先接受预约
    TwilioClient.Init(ConfigurationManager.AppSettings["TwilioAccountSid"], 
                      ConfigurationManager.AppSettings["TwilioAuthToken"]);
    
    AcceptReservationResource.Create(
        pathWorkspaceSid: workspaceSid,
        pathTaskSid: taskSid,
        pathReservationSid: reservationSid
    );

    // 2. 发起呼叫到Twilio Client
    var call = CallResource.Create(
        to: new Twilio.Types.PhoneNumber("client:worker_client_name"),
        from: new Twilio.Types.PhoneNumber("+1234567890"),
        url: new Uri(Url.Action("CallHandler", "Twilio", null, Request.Url.Scheme)) // 处理呼叫的Twiml接口
    );
}

// 生成Twiml关联任务通话
public ActionResult CallHandler()
{
    var twiml = new Twilio.TwiML.VoiceResponse();
    // 将呼叫加入对应TaskRouter任务队列
    twiml.Enqueue(taskSid: Request.Form["TaskSid"]);
    return Content(twiml.ToString(), "application/xml");
}

关键注意事项

  • 确保你的Twilio Client已经正确注册(比如通过Twilio.Device.setup完成初始化)
  • 所有回调URL必须是HTTPS且公网可访问,Twilio不支持HTTP回调
  • 一定要验证Twilio的请求签名,防止恶意请求伪造回调
  • 手动呼叫时,要确保先接受预约再发起呼叫,避免任务状态不一致

内容的提问来源于stack exchange,提问作者Chintan Mstry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:05