Twilio .net SDK在为TaskQueue制作TaskRouterCapability时出错

时间:2017-10-17 05:25:40

标签: twilio

我正在尝试使用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(策略定义为我们无法访问给定资源)

因此调用了连接事件,但就绪事件永远不会发生。

1 个答案:

答案 0 :(得分:0)

原来样本中有2个错误:

  1. TaskRouterCapability构造函数的channel参数应该传递给TaskQueue Sid而不是null。值null会导致异常 发生System.NullReferenceException HResult = 0x80004003 Message =对象引用未设置为对象的实例。 Source = StackTrace:在Twilio.Jwt.Jwt.BaseJwt.ToJwt()的Twilio.Jwt.Taskrouter.TaskRouterCapability.get_Claims()

  2. PolicyUrlUtils的TaskQueue属性中存在拼写错误。该URL应具有TaskQueues而不是TaskQueue

  3. 已提交相同https://github.com/TwilioDevEd/api-snippets/pull/539

    的拉取请求