/// <summary> /// Creates a new browser object with a set of filters. /// </summary> /// <param name="context">The system context to use.</param> /// <param name="view">The view which may restrict the set of references/nodes found.</param> /// <param name="referenceType">The type of references being followed.</param> /// <param name="includeSubtypes">Whether subtypes of the reference type are followed.</param> /// <param name="browseDirection">Which way the references are being followed.</param> /// <param name="browseName">The browse name of a specific target (used when translating browse paths).</param> /// <param name="additionalReferences">Any additional references that should be included.</param> /// <param name="internalOnly">If true the browser should not making blocking calls to external systems.</param> /// <param name="itemId">The item id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> public DaElementBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly, string itemId, ushort namespaceIndex) : base( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly) { m_itemId = itemId; m_namespaceIndex = namespaceIndex; m_stage = Stage.Begin; }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> public NodeBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly) { m_context = context; m_view = view; m_referenceType = referenceType; m_includeSubtypes = includeSubtypes; m_browseDirection = browseDirection; m_browseName = browseName; m_internalOnly = internalOnly; m_references = new List<IReference>(); m_index = 0; // add any additional references if they meet the criteria. if (additionalReferences != null) { foreach (IReference reference in additionalReferences) { if (IsRequired(reference.ReferenceTypeId, reference.IsInverse)) { m_references.Add(reference); } } } }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> public NodeBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable <IReference> additionalReferences, bool internalOnly) { m_context = context; m_view = view; m_referenceType = referenceType; m_includeSubtypes = includeSubtypes; m_browseDirection = browseDirection; m_browseName = browseName; m_internalOnly = internalOnly; m_references = new List <IReference>(); m_index = 0; // add any additional references if they meet the criteria. if (additionalReferences != null) { foreach (IReference reference in additionalReferences) { if (IsRequired(reference.ReferenceTypeId, reference.IsInverse)) { m_references.Add(reference); } } } }
/// <summary> /// Invokes the QueryFirst service. /// </summary> public virtual ResponseHeader QueryFirst( RequestHeader requestHeader, ViewDescription view, NodeTypeDescriptionCollection nodeTypes, ContentFilter filter, uint maxDataSetsToReturn, uint maxReferencesToReturn, out QueryDataSetCollection queryDataSets, out byte[] continuationPoint, out ParsingResultCollection parsingResults, out DiagnosticInfoCollection diagnosticInfos, out ContentFilterResult filterResult) { queryDataSets = null; continuationPoint = null; parsingResults = null; diagnosticInfos = null; filterResult = null; ValidateRequest(requestHeader); // Insert implementation. return(CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported)); }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> public AreaBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly, AreaState area) : base( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly) { m_stage = Stage.Begin; if (area != null) { m_area = AreaState.GetDirectory(context, area.NodeId); m_isRoot = area.IsRoot; } }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> public Browser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly, Opc.Ua.Client.Session client, NamespaceMapper mapper, NodeState source, NodeId rootId) : base( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly) { m_client = client; m_mapper = mapper; m_source = source; m_rootId = rootId; m_stage = Stage.Begin; }
/// <summary> /// Determines whether a node id is a valid view id. /// </summary> /// <param name="description">The description.</param> /// <returns> /// <c>true</c> if the specified description is valid; otherwise, <c>false</c>. /// </returns> public bool IsValid(ViewDescription description) { if (ViewDescription.IsDefault(description)) { return(true); } lock (m_lock) { return(m_views.ContainsKey(description.ViewId)); } }
/// <summary> /// Determines whether a node id is a valid view id. /// </summary> /// <param name="description">The description.</param> /// <returns> /// <c>true</c> if the specified description is valid; otherwise, <c>false</c>. /// </returns> public bool IsValid(ViewDescription description) { if (ViewDescription.IsDefault(description)) { return true; } lock (m_lock) { return m_views.ContainsKey(description.ViewId); } }
/// <summary> /// Returns true if the view description represents the default (null) view. /// </summary> public static bool IsDefault(ViewDescription view) { if (view == null) { return(true); } if (NodeId.IsNull(view.m_viewId) && view.m_viewVersion == 0 && view.m_timestamp == DateTime.MinValue) { return(true); } return(false); }
/// <summary> /// Returns true if the view description represents the default (null) view. /// </summary> public static bool IsDefault(ViewDescription view) { if (view == null) { return true; } if (NodeId.IsNull(view.m_viewId) && view.m_viewVersion == 0 && view.m_timestamp == DateTime.MinValue) { return true; } return false; }
/// <summary> /// Invokes the Browse service. /// </summary> public virtual ResponseHeader Browse( RequestHeader requestHeader, ViewDescription view, uint requestedMaxReferencesPerNode, BrowseDescriptionCollection nodesToBrowse, out BrowseResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { results = null; diagnosticInfos = null; ValidateRequest(requestHeader); // Insert implementation. return(CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported)); }
/// <summary> /// Determines whether a reference is in a view. /// </summary> /// <param name="description">The description.</param> /// <param name="reference">The reference.</param> /// <returns> /// <c>true</c> whether a reference is in a view; otherwise, <c>false</c>. /// </returns> public bool IsReferenceInView(ViewDescription description, ReferenceDescription reference) { // everything is in the default view. if (ViewDescription.IsDefault(description)) { return(true); } lock (m_lock) { ViewNode view = null; if (m_views.TryGetValue(description.ViewId, out view)) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } return(false); } }
/// <summary> /// Determines whether a node is in a view. /// </summary> /// <param name="description">The description.</param> /// <param name="nodeId">The node id.</param> /// <returns> /// <c>true</c> whether a node is in a view; otherwise, <c>false</c>. /// </returns> public bool IsNodeInView(ViewDescription description, NodeId nodeId) { // everything is in the default view. if (ViewDescription.IsDefault(description)) { return true; } lock (m_lock) { ViewNode view = null; if (m_views.TryGetValue(description.ViewId, out view)) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } return false; } }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> /// <param name="context">The system context to use.</param> /// <param name="view">The view which may restrict the set of references/nodes found.</param> /// <param name="referenceType">The type of references being followed.</param> /// <param name="includeSubtypes">Whether subtypes of the reference type are followed.</param> /// <param name="browseDirection">Which way the references are being followed.</param> /// <param name="browseName">The browse name of a specific target (used when translating browse paths).</param> /// <param name="additionalReferences">Any additional references that should be included.</param> /// <param name="internalOnly">If true the browser should not making blocking calls to external systems.</param> /// <param name="source">The segment being accessed.</param> public ArchiveFolderBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly, ArchiveFolderState source) : base( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly) { m_source = source; m_stage = Stage.Begin; }
/// <summary> /// Creates a new browser object with a set of filters. /// </summary> public MemoryBufferBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly, MemoryBufferState buffer) : base( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly) { m_buffer = buffer; m_stage = Stage.Begin; }
private void ChangeViewBTN_Click(object sender, EventArgs e) { try { ViewDescription view = null; ReferenceDescription reference = ViewCB.SelectedItem as ReferenceDescription; if (reference != null && !NodeId.IsNull(reference.NodeId)) { view = new ViewDescription(); view.ViewId = ExpandedNodeId.ToNodeId(reference.NodeId, m_session.NamespaceUris); view.ViewVersion = 0; view.Timestamp = DateTime.MinValue; } BrowseCTRL.View = view; BrowseCTRL.RefreshSelection(); } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Validates the view description passed to a browse request (throws on error). /// </summary> protected virtual void ValidateViewDescription(ServerSystemContext context, ViewDescription view) { if (ViewDescription.IsDefault(view)) { return; } ViewState node = (ViewState)FindPredefinedNode(view.ViewId, typeof(ViewState)); if (node == null) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } if (view.Timestamp != DateTime.MinValue) { throw new ServiceResultException(StatusCodes.BadViewTimestampInvalid); } if (view.ViewVersion != 0) { throw new ServiceResultException(StatusCodes.BadViewVersionInvalid); } }
/// <summary> /// Prompts the user to select a node. /// </summary> public ReferenceDescription ShowDialog( Session session, NodeId rootId, ViewDescription view, string caption, params NodeId[] referenceTypeIds) { // set the caption. if (!String.IsNullOrEmpty(caption)) { this.Text = caption; } // set default root. if (NodeId.IsNull(rootId)) { rootId = Opc.Ua.ObjectIds.ObjectsFolder; } // set default reference type. if (referenceTypeIds == null) { referenceTypeIds = new NodeId[] { Opc.Ua.ReferenceTypeIds.HierarchicalReferences }; } // initialize the control. BrowseCTRL.Initialize(session, rootId, referenceTypeIds); BrowseCTRL.View = view; // display the dialog. if (ShowDialog() != DialogResult.OK) { return null; } return BrowseCTRL.SelectedNode; }
/// <summary> /// Invokes the QueryFirst service. /// </summary> public virtual ResponseHeader QueryFirst( RequestHeader requestHeader, ViewDescription view, NodeTypeDescriptionCollection nodeTypes, ContentFilter filter, uint maxDataSetsToReturn, uint maxReferencesToReturn, out QueryDataSetCollection queryDataSets, out byte[] continuationPoint, out ParsingResultCollection parsingResults, out DiagnosticInfoCollection diagnosticInfos, out ContentFilterResult filterResult) { queryDataSets = null; continuationPoint = null; parsingResults = null; diagnosticInfos = null; filterResult = null; ValidateRequest(requestHeader); // Insert implementation. return CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported); }
/// <summary> /// Invokes the Browse service. /// </summary> public virtual ResponseHeader Browse( RequestHeader requestHeader, ViewDescription view, uint requestedMaxReferencesPerNode, BrowseDescriptionCollection nodesToBrowse, out BrowseResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { results = null; diagnosticInfos = null; ValidateRequest(requestHeader); // Insert implementation. return CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported); }
/// <summary> /// Called to create the browser for the item configuration. /// </summary> private NodeBrowser OnCreateItemConfigurationBrowser( ISystemContext context, NodeState node, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly) { HdaParsedNodeId nodeId = HdaParsedNodeId.Parse(node.NodeId); if (nodeId == null) { return null; } return new HdaElementBrower( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly, nodeId.RootId, Opc.Ua.ObjectTypeIds.HistoricalDataConfigurationType, Opc.Ua.BrowseNames.HAConfiguration, NamespaceIndex); }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescriptionCollection nodesToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); while (nodesToBrowse.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(nodesToBrowse[ii]); } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. ByteStringCollection revisedContiuationPoints = new ByteStringCollection(); while (continuationPoints.Count > 0) { // continue browse operation. session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); for (int ii = 0; ii < continuationPoints.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { revisedContiuationPoints.Add(results[ii].ContinuationPoint); } } // check if browsing must continue; revisedContiuationPoints = continuationPoints; } // check if unprocessed results exist. nodesToBrowse = unprocessedOperations; } // return complete list. return references; } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return null; } }
/// <summary> /// Begins an asynchronous invocation of the Browse service. /// </summary> public IAsyncResult BeginBrowse( RequestHeader requestHeader, ViewDescription view, uint requestedMaxReferencesPerNode, BrowseDescriptionCollection nodesToBrowse, AsyncCallback callback, object asyncState) { BrowseRequest request = new BrowseRequest(); request.RequestHeader = requestHeader; request.View = view; request.RequestedMaxReferencesPerNode = requestedMaxReferencesPerNode; request.NodesToBrowse = nodesToBrowse; UpdateRequestHeader(request, requestHeader == null, "Browse"); if (UseTransportChannel) { return TransportChannel.BeginSendRequest(request, callback, asyncState); } return InnerChannel.BeginBrowse(new BrowseMessage(request), callback, asyncState); }
/// <summary> /// Invokes the QueryFirst service. /// </summary> public virtual ResponseHeader QueryFirst( RequestHeader requestHeader, ViewDescription view, NodeTypeDescriptionCollection nodeTypes, ContentFilter filter, uint maxDataSetsToReturn, uint maxReferencesToReturn, out QueryDataSetCollection queryDataSets, out byte[] continuationPoint, out ParsingResultCollection parsingResults, out DiagnosticInfoCollection diagnosticInfos, out ContentFilterResult filterResult) { QueryFirstRequest request = new QueryFirstRequest(); QueryFirstResponse response = null; request.RequestHeader = requestHeader; request.View = view; request.NodeTypes = nodeTypes; request.Filter = filter; request.MaxDataSetsToReturn = maxDataSetsToReturn; request.MaxReferencesToReturn = maxReferencesToReturn; UpdateRequestHeader(request, requestHeader == null, "QueryFirst"); try { if (UseTransportChannel) { IServiceResponse genericResponse = TransportChannel.SendRequest(request); if (genericResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } ValidateResponse(genericResponse.ResponseHeader); response = (QueryFirstResponse)genericResponse; } else { QueryFirstResponseMessage responseMessage = InnerChannel.QueryFirst(new QueryFirstMessage(request)); if (responseMessage == null || responseMessage.QueryFirstResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } response = responseMessage.QueryFirstResponse; ValidateResponse(response.ResponseHeader); } queryDataSets = response.QueryDataSets; continuationPoint = response.ContinuationPoint; parsingResults = response.ParsingResults; diagnosticInfos = response.DiagnosticInfos; filterResult = response.FilterResult; } finally { RequestCompleted(request, response, "QueryFirst"); } return response.ResponseHeader; }
/// <summary> /// Validates the view description passed to a browse request (throws on error). /// </summary> protected virtual void ValidateViewDescription(ServerSystemContext context, ViewDescription view) { if (!ViewDescription.IsDefault(view)) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } }
/// <summary> /// Begins an asynchronous invocation of the QueryFirst service. /// </summary> public IAsyncResult BeginQueryFirst( RequestHeader requestHeader, ViewDescription view, NodeTypeDescriptionCollection nodeTypes, ContentFilter filter, uint maxDataSetsToReturn, uint maxReferencesToReturn, AsyncCallback callback, object asyncState) { QueryFirstRequest request = new QueryFirstRequest(); request.RequestHeader = requestHeader; request.View = view; request.NodeTypes = nodeTypes; request.Filter = filter; request.MaxDataSetsToReturn = maxDataSetsToReturn; request.MaxReferencesToReturn = maxReferencesToReturn; UpdateRequestHeader(request, requestHeader == null, "QueryFirst"); if (UseTransportChannel) { return TransportChannel.BeginSendRequest(request, callback, asyncState); } return InnerChannel.BeginQueryFirst(new QueryFirstMessage(request), callback, asyncState); }
public override INodeBrowser CreateBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly) { MemoryRegisterBrowser browser = new MemoryRegisterBrowser( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly, this); return browser; }
/// <summary> /// Used to receive notifications when a node browser is created. /// </summary> public NodeBrowser OnCreateBrowser( ISystemContext context, NodeState node, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly) { Browser browser = new Browser( context, view, referenceType, includeSubtypes, browseDirection, browseName, null, false, GetClientSession(context as ServerSystemContext), m_mapper, Object.ReferenceEquals(node, m_root)?null:node, m_root.NodeId); return browser; }
/// <summary> /// Invokes the Browse service. /// </summary> public virtual ResponseHeader Browse( RequestHeader requestHeader, ViewDescription view, uint requestedMaxReferencesPerNode, BrowseDescriptionCollection nodesToBrowse, out BrowseResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { BrowseRequest request = new BrowseRequest(); BrowseResponse response = null; request.RequestHeader = requestHeader; request.View = view; request.RequestedMaxReferencesPerNode = requestedMaxReferencesPerNode; request.NodesToBrowse = nodesToBrowse; UpdateRequestHeader(request, requestHeader == null, "Browse"); try { if (UseTransportChannel) { IServiceResponse genericResponse = TransportChannel.SendRequest(request); if (genericResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } ValidateResponse(genericResponse.ResponseHeader); response = (BrowseResponse)genericResponse; } else { BrowseResponseMessage responseMessage = InnerChannel.Browse(new BrowseMessage(request)); if (responseMessage == null || responseMessage.BrowseResponse == null) { throw new ServiceResultException(StatusCodes.BadUnknownResponse); } response = responseMessage.BrowseResponse; ValidateResponse(response.ResponseHeader); } results = response.Results; diagnosticInfos = response.DiagnosticInfos; } finally { RequestCompleted(request, response, "Browse"); } return response.ResponseHeader; }
/// <summary> /// Creates a browser that finds the references to the branch. /// </summary> /// <param name="context">The system context to use.</param> /// <param name="view">The view which may restrict the set of references/nodes found.</param> /// <param name="referenceType">The type of references being followed.</param> /// <param name="includeSubtypes">Whether subtypes of the reference type are followed.</param> /// <param name="browseDirection">Which way the references are being followed.</param> /// <param name="browseName">The browse name of a specific target (used when translating browse paths).</param> /// <param name="additionalReferences">Any additional references that should be included.</param> /// <param name="internalOnly">If true the browser should not making blocking calls to external systems.</param> /// <returns>The browse object (must be disposed).</returns> public override INodeBrowser CreateBrowser( ISystemContext context, ViewDescription view, NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection, QualifiedName browseName, IEnumerable<IReference> additionalReferences, bool internalOnly) { NodeBrowser browser = new DaElementBrowser( context, view, referenceType, includeSubtypes, browseDirection, browseName, additionalReferences, internalOnly, this.ItemId, this.NodeId.NamespaceIndex); PopulateBrowser(context, browser); return browser; }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescription nodeToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); // construct browse request. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); do { // check for error. if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // process results. for (int ii = 0; ii < results[0].References.Count; ii++) { references.Add(results[0].References[ii]); } // check if all references have been fetched. if (results[0].References.Count == 0 || results[0].ContinuationPoint == null) { break; } // continue browse operation. ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); } while (true); //return complete list. return references; } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return null; } }