From 266e29b38384cc9ad947a7bd13a1aa630dcb15a2 Mon Sep 17 00:00:00 2001 From: Andreas Heisel Date: Thu, 1 Jun 2023 10:20:55 +0200 Subject: [PATCH] Fixes an issue in Session.LoadDataTypeSystem. (#2166) Starting with line 1857 a dictionary of namespaces is populated in an defensive manner. If a namespace value can't be read, it is silently ignored. If this happens, it will result in an KeyNotFoundException when populating the imports dictionary. This fix adds a warning if a namespace value can't be read and populates the imports dictionary also defensivly. --- Libraries/Opc.Ua.Client/Session.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Libraries/Opc.Ua.Client/Session.cs b/Libraries/Opc.Ua.Client/Session.cs index 33067289f..244c65fae 100644 --- a/Libraries/Opc.Ua.Client/Session.cs +++ b/Libraries/Opc.Ua.Client/Session.cs @@ -1860,6 +1860,10 @@ public async Task LoadDataDictionary(ReferenceDescription dictio { namespaces[((NodeId)referenceNodeIds[ii])] = (string)nameSpaceValues[ii]; } + else + { + Utils.LogWarning("Failed to load namespace {0}: {1}", namespaceNodeIds[ii], errors[ii]); + } } // build the namespace/schema import dictionary @@ -1867,9 +1871,9 @@ public async Task LoadDataDictionary(ReferenceDescription dictio foreach (var r in references) { NodeId nodeId = ExpandedNodeId.ToNodeId(r.NodeId, NamespaceUris); - if (schemas.TryGetValue(nodeId, out var schema)) + if (schemas.TryGetValue(nodeId, out var schema) && namespaces.TryGetValue(nodeId, out var ns)) { - imports[namespaces[nodeId]] = schema; + imports[ns] = schema; } }