我們使用 Azure IOT Hub 來送命令給 RPi 去開門,
忽然有一天我們的 UWP 程式居然直接掛點了,
是掛在讀取 Azure IOT Hub 的 Message 那裡(deviceClient.ReceiveAsync()),
錯誤是「'System.NullReferenceException' in Microsoft.Azure.Amqp.Uwp.dll」。
測試程式如下,
try
{
ReceiveC2dAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
private static async Task ReceiveC2dAsync()
{
DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(
"HostName=gsstddhub.azure-devices.net;DeviceId=0521;SharedAccessKey=keys"
, TransportType.Amqp);
while (true)
{
Message receivedMessage = null;
try
{
receivedMessage = await deviceClient.ReceiveAsync();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
if (receivedMessage == null) continue;
await deviceClient.CompleteAsync(receivedMessage);
}
}
明明就有用 Try ... Catch 去攔呀!
為什麼會跳出我的 Try ... Catch 呢? 讓程式直接掛掉,如下,
進入 Azure Portal 才發現原來是因為訂閱的$沒了,所以服務就不能Run了。
原本 TransportType 是使用 Amqp ,當我改成了 Http 後,
就可以攔到錯誤了!!!
'Microsoft.Azure.Devices.Client.Exceptions.QuotaExceededException' in mscorlib.ni.dll
但改用 Amqp 就會攔不到。
後來上 github 上詢問原來是 Microsoft.Azure.Amqp.Uwp.dll 的 Bug ,已修好了,
So ... 就等它的新版本吧!
詳細可以參考「How to handle Microsoft.Azure.Devices.Client exception at UWP app, when TransportType set Amqp ? 」
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^