gpt4 book ai didi

c# - ServiceClient (Microsoft.Azure.Devices) OpenAsync 问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:33 25 4
gpt4 key购买 nike

运行我们的 Azure 辅助角色(事件处理器主机)一段时间后,我们收到了这个奇怪的错误。最初我认为这是由于我们通过 ServiceClient (Microsoft.Azure.Devices) 将太多的云到设备消息排队,但我们肯定会看到“设备队列深度不能超过 50 条消息”错误。我们对于关闭和处置也非常小心。

代码如下:

public async Task<AzureDevices.Message> SendCloudToDeviceAsync(string deviceId, string message, bool ack = false, string MessageId = null)
{
AzureDevices.ServiceClient ServiceClient = null;

try
{
ServiceClient = AzureDevices.ServiceClient.CreateFromConnectionString(Configuration.IOTHubConnectionString);
await ServiceClient.OpenAsync();

logger.Info(string.Format("Encoding & Sending message {0} for Device {1}", message, deviceId));
var commandMessage = new AzureDevices.Message(Encoding.ASCII.GetBytes(message))
{
//Whether we require feedback from the hub...
Ack = ack == true ? AzureDevices.DeliveryAcknowledgement.Full : AzureDevices.DeliveryAcknowledgement.None,
MessageId = MessageId == null ? Guid.NewGuid().ToString() : MessageId,
//ExpiryTimeUtc = expiry,
To = deviceId
};

await ServiceClient.SendAsync(deviceId, commandMessage);

Common.ExtensionMethods.WriteHighlightedMessage(string.Format("Sent message {0} with MessageId {1}", message, commandMessage.MessageId), ConsoleColor.Green);
logger.Info(string.Format("Sent message {0} with MessageId {1}", message, commandMessage.MessageId));

return commandMessage;
}

catch (Exception e)
{
Common.ExtensionMethods.WriteHighlightedMessage(string.Format("SendCloudToDeviceMessageAsync: {0}", e.Message), ConsoleColor.Red);
if (e.Message.Contains("Device Queue depth cannot exceed 50 messages"))
{
logger.Warn("SendCloudToDeviceMessageAsync for device {0}: {1}", deviceId, e.Message);
if (e.InnerException != null) logger.Warn(e.InnerException);
}
else
{
logger.Error("SendCloudToDeviceMessageAsync for device {0}: {1}", deviceId, e.Message);
logger.Error(e.StackTrace);
if (e.InnerException != null) logger.Error(e.InnerException);
}
}
finally
{
if(ServiceClient != null)
{
await ServiceClient.CloseAsync();
ServiceClient.Dispose();
}
}

return new AzureDevices.Message();
}

这是 InnerException 的一部分:System.IO.IOException:加密操作失败,请参阅内部异常。 ---> System.ComponentModel.Win32Exception:上下文已过期,无法再使用

触发错误的确切行位于 OpenAsync() 上。我很可能在多个线程上执行此操作,有限制吗?

在未来的版本中,我们不会执行“应用程序层 ACK”,而是让决策者认为服务器通过 MQTT ACK 感到满意。这将减少我们发送的云到设备消息的数量。

最佳答案

设备到云命令在 IoT 中心排队,并仅在设备连接时异步传送。每个设备只能排队 50 个命令。请参阅 here即使你关闭了服务客户端,该命令仍然在服务端的队列中,直到设备客户端完全接收到消息。所以我认为你应该确保队列中的命令没有超过限制。

关于c# - ServiceClient (Microsoft.Azure.Devices) OpenAsync 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com