【发布时间】:2017-07-09 18:56:36
【问题描述】:
- SDK: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 分钟内过期。
【问题讨论】:
-
这是一个已经报过的bug——目前如果你使用MQTT,设备连接时会检查token,但是token过期时IoT Hub不会断开设备。
-
好的,谢谢。你能提供一个问题的链接吗?所以你的意思是在使用例如AMQP你没有这个问题吗?
-
我没有指向该问题的公共链接。我刚刚尝试使用 AMQP 并在 SAS 过期时出现授权错误,HTTP 也是如此。所以这个问题目前只存在于 MQTT 协议中。
-
包版本 Microsoft.Azure.Devices.Client 1.5.0 的错误仍然存在。这是错误的 URL:github.com/Azure/azure-iot-sdk-c/issues/163 谢谢!
标签: c# azure-iot-hub azure-iot-sdk