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,先确保已经安装了TwilioNuGet包,然后在回调处理方法中编写代码:
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
相关产品推荐
相关产品推荐

