- 开发工具包:C#
- 版本:Microsoft.Azure.Devices.Client 1.2.3
错误重现代码:
让以下运行 15 分钟左右*,您会看到发送仍然成功,尽管令牌应该已经过期。var hostName = ... var deviceId = ... var sasToken = new SharedAccessSignatureBuilder { Key = sharedAccessKey, Target = $"{hostName}/devices/{deviceId}", TimeToLive = TimeSpan.FromMinutes(5) } .ToSignature(); var authenticationMethod = new DeviceAuthenticationWithToken(deviceId, sasToken); var connectionString = IotHubConnectionStringBuilder .Create(hostName, authenticationMethod) .ToString(); var deviceClient = DeviceClient .CreateFromConnectionString(connectionString, TransportType.Mqtt); while (true) { Console.WriteLine($"{DateTime.UtcNow}: Sending"); var messageContent = Encoding.UTF8.GetBytes("{}"); var message = new Message(messageContent); await deviceClient.SendEventAsync(message); await Task.Delay(TimeSpan.FromSeconds(10)); }
如果我错了,请纠正我,但这是否意味着打开的连接永远不会过期?这是谁的错?我会说物联网中心应该在令牌过期时关闭连接,对吗?
* 在内部,令牌似乎再有效五分钟,因为这就是他们定义为MaxClockSkew
. 因此,为了节省一些时间,您可以设置SharedAccessSignatureBuilder.TimeToLive
为 -4.9 分钟,令牌应在 0.1 分钟内过期。