我正在尝试使用TaskRouter.js SDK为TaskQueue提取一些统计信息。为此,我需要生成一个功能路由器令牌,允许访问TaskQueue。根据{{3}}处的示例,我应该传递null作为通道参数(查看C#.Net示例),以生成TaskRouterCapability标记。但是当我这样做时,我得到一个异常(get_Claims中的对象为null)。
查看源代码,我应该将TaskQueue Sid作为通道id而不是null传递。当我这样做时,正确生成了一个令牌。
首先,我使用twilio docs处的基本令牌生成示例代码:
class Program {
static void Main(string[] args)
{
// Find your Account Sid and Auth Token at twilio.com/console
const string accountSid = "ACbe0c12d747XXXXXXXXXXXXXXXXXb";
const string authToken = "your_auth_token";
const string workspaceSid = "WSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const string taskQueueSid = "WQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var urls = new PolicyUrlUtils(workspaceSid, taskQueueSid);
var allowFetchSubresources = new Policy($"{urls.TaskQueue}/**",
HttpMethod.Get);
var allowUpdates = new Policy(urls.TaskQueue, HttpMethod.Post);
var policies = new List<Policy>
{
allowFetchSubresources,
allowUpdates
};
// By default, tokens are good for one hour.
// Override this default timeout by specifiying a new value (in seconds).
// For example, to generate a token good for 8 hours:
var capability = new TaskRouterCapability(
accountSid,
authToken,
workspaceSid,
null,
policies: policies,
expiration: DateTime.UtcNow.AddSeconds(28800) // 60 * 60 * 8
);
Console.WriteLine(capability.ToJwt());
} }
class PolicyUrlUtils {
const string taskRouterBaseUrl = "https://taskrouter.twilio.com";
const string taskRouterVersion = "v1";
readonly string _workspaceSid;
readonly string _taskQueueSid;
public PolicyUrlUtils(string workspaceSid, string taskQueueSid)
{
_workspaceSid = workspaceSid;
_taskQueueSid = taskQueueSid;
}
public string TaskQueue => $"{Workspace}/TaskQueue/{_taskQueueSid}";
string Workspace =>
$"{taskRouterBaseUrl}/{taskRouterVersion}/Workspaces/{_workspaceSid}";
}
这在最后一行(capability.ToJwt())上给了我一个例外。例外是:
System.NullReferenceException occurred
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=<Cannot evaluate the exception source>
StackTrace:
at Twilio.Jwt.Taskrouter.TaskRouterCapability.get_Claims()
at Twilio.Jwt.BaseJwt.ToJwt()
at DeleteMe.Program.Main(String[] args) in D:\Projects\DeleteMe\DeleteMe\Program.cs:line 46
现在,我在twilio docs查看了TaskRouterCapability的源代码,似乎应该将队列sid作为channel参数传递。当我这样做时,会创建令牌。所以我拿了这里生成的令牌,并把它放到这个HTML文件中:
<html>
<head>
<script type="text/javascript" src="https://media.twiliocdn.com/taskrouter/js/v1.11/taskrouter.min.js"></script>
<script type="text/javascript">
var taskQueue = new Twilio.TaskRouter.TaskQueue("token generated by console application");
taskQueue.on("ready", function (taskQueue) {
console.log(taskQueue.sid) // 'WQxxx'
console.log(taskQueue.friendlyName) // 'Simple FIFO Queue'
console.log(taskQueue.targetWorkers) // '1==1'
console.log(taskQueue.maxReservedWorkers) // 20
});
</script>
</head>
<body>
</body>
然后在控制台中给我一些消息:
taskrouter.min.js:1 Websocket已打开:wss://event-bridge.twilio.com/v1/wschannels/ACxxxxxxxxxxxxxx/WQxxxxxxxx?token = eyJh .....&amp; closeExistingSessions = false taskrouter.min.js:1收到类型[已连接]的消息 taskrouter.min.js:1 POST twilio-csharp github 403(策略定义为我们无法访问给定资源)
因此调用了连接事件,但就绪事件永远不会发生。
答案 0 :(得分:0)
原来样本中有2个错误:
TaskRouterCapability构造函数的channel参数应该传递给TaskQueue Sid而不是null。值null会导致异常 发生System.NullReferenceException HResult = 0x80004003 Message =对象引用未设置为对象的实例。 Source = StackTrace:在Twilio.Jwt.Jwt.BaseJwt.ToJwt()的Twilio.Jwt.Taskrouter.TaskRouterCapability.get_Claims()
PolicyUrlUtils的TaskQueue属性中存在拼写错误。该URL应具有TaskQueues而不是TaskQueue