/// <inheritdoc/> public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(string endpointId, BrowseNextRequestApiModel content, CancellationToken ct) { if (string.IsNullOrEmpty(endpointId)) { throw new ArgumentNullException(nameof(endpointId)); } if (content == null) { throw new ArgumentNullException(nameof(content)); } if (content.ContinuationToken == null) { throw new ArgumentNullException(nameof(content.ContinuationToken)); } var path = new UriBuilder($"{_serviceUri}/v2/browse/{endpointId}/next") { Query = $"continuationToken={content.ContinuationToken}" }; var request = _httpClient.NewRequest(path.ToString()); _serializer.SetAcceptHeaders(request); var response = await _httpClient.GetAsync(request, ct).ConfigureAwait(false); response.Validate(); return(_serializer.DeserializeResponse <BrowseNextResponseApiModel>(response)); }
/// <inheritdoc/> public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(EndpointApiModel endpoint, BrowseNextRequestApiModel request, CancellationToken ct) { if (endpoint == null) { throw new ArgumentNullException(nameof(endpoint)); } if (string.IsNullOrEmpty(endpoint.Url)) { throw new ArgumentNullException(nameof(endpoint.Url)); } if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.ContinuationToken == null) { throw new ArgumentNullException(nameof(request.ContinuationToken)); } var response = await _methodClient.CallMethodAsync(_deviceId, _moduleId, "BrowseNext_V2", _serializer.SerializeToString(new { endpoint, request }), null, ct); return(_serializer.Deserialize <BrowseNextResponseApiModel>(response)); }
/// <summary> /// Browse next references on endpoint /// </summary> /// <param name="api"></param> /// <param name="endpointUrl"></param> /// <param name="request"></param> /// <param name="ct"></param> /// <returns></returns> public static Task <BrowseNextResponseApiModel> NodeBrowseNextAsync( this ITwinModuleApi api, string endpointUrl, BrowseNextRequestApiModel request, CancellationToken ct = default) { return(api.NodeBrowseNextAsync(new EndpointApiModel { Url = endpointUrl, SecurityMode = SecurityMode.None }, request, ct)); }
/// <summary> /// Browse next /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <BrowseNextResponseApiModel> BrowseNextAsync( BrowseNextRequestApiModel request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } var result = await _browse.NodeBrowseNextAsync( _twin.Endpoint, request.ToServiceModel()); return(new BrowseNextResponseApiModel(result)); }
/// <summary> /// Get tree next page /// </summary> /// <param name="endpointId"></param> /// <param name="parentId"></param> /// <param name="discovererId"></param> /// <param name="credential"></param> /// <param name="previousPage"></param> /// <returns>ListNode</returns> public async Task <PagedResult <ListNode> > GetTreeNextAsync(string endpointId, List <string> parentId, string discovererId, CredentialModel credential = null, PagedResult <ListNode> previousPage = null) { var pageResult = new PagedResult <ListNode>(); var header = Elevate(new RequestHeaderApiModel(), credential); var modelNext = new BrowseNextRequestApiModel { ContinuationToken = previousPage.ContinuationToken, TargetNodesOnly = true, ReadVariableValues = true }; modelNext.Header = header; try { var browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext); if (browseDataNext.References != null) { foreach (var nodeReference in browseDataNext.References) { previousPage.Results.Add(new ListNode { Id = nodeReference.Target.NodeId.ToString(), NodeClass = nodeReference.Target.NodeClass ?? 0, NodeName = nodeReference.Target.DisplayName.ToString(), Children = (bool)nodeReference.Target.Children, ParentIdList = parentId, DiscovererId = discovererId, AccessLevel = nodeReference.Target.AccessLevel ?? 0, ParentName = _displayName, DataType = nodeReference.Target.DataType, Value = nodeReference.Target.Value?.ToJson()?.TrimQuotes(), Publishing = false, PublishedItem = null }); } } pageResult.Results = previousPage.Results; pageResult.ContinuationToken = browseDataNext.ContinuationToken; } catch (UnauthorizedAccessException) { pageResult.Error = "Unauthorized access: Bad User Access Denied."; } catch (Exception e) { var message = "Cannot browse"; _logger.Error(e, message); pageResult.Error = message; } return(pageResult); }
/// <summary> /// Convert back to service model /// </summary> /// <returns></returns> public static BrowseNextRequestModel ToServiceModel( this BrowseNextRequestApiModel model) { if (model == null) { return(null); } return(new BrowseNextRequestModel { Abort = model.Abort, TargetNodesOnly = model.TargetNodesOnly, ReadVariableValues = model.ReadVariableValues, ContinuationToken = model.ContinuationToken, Header = model.Header.ToServiceModel() }); }
public async Task <BrowseNextResponseApiModel> BrowseNextAsync( string endpointId, [FromBody][Required] BrowseNextRequestApiModel request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.ContinuationToken == null) { throw new ArgumentNullException(nameof(request.ContinuationToken)); } var browseresult = await _broser.NodeBrowseNextAsync(endpointId, request.ToServiceModel()); return(new BrowseNextResponseApiModel(browseresult)); }
/// <inheritdoc/> public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(string endpointId, BrowseNextRequestApiModel content, CancellationToken ct) { if (string.IsNullOrEmpty(endpointId)) { throw new ArgumentNullException(nameof(endpointId)); } if (content == null) { throw new ArgumentNullException(nameof(content)); } if (content.ContinuationToken == null) { throw new ArgumentNullException(nameof(content.ContinuationToken)); } var request = _httpClient.NewRequest($"{_serviceUri}/v2/browse/{endpointId}/next", _resourceId); request.SetContent(content); var response = await _httpClient.PostAsync(request, ct).ConfigureAwait(false); response.Validate(); return(response.GetContent <BrowseNextResponseApiModel>()); }
/// <summary> /// Get tree next page /// </summary> /// <param name="endpointId"></param> /// <param name="parentId"></param> /// <param name="discovererId"></param> /// <param name="credential"></param> /// <param name="previousPage"></param> /// <returns>ListNode</returns> public async Task <PagedResult <ListNode> > GetTreeNextAsync(string endpointId, List <string> parentId, string discovererId, CredentialModel credential = null, PagedResult <ListNode> previousPage = null) { var pageResult = new PagedResult <ListNode>(); var header = Elevate(new RequestHeaderApiModel(), credential); var modelNext = new BrowseNextRequestApiModel { ContinuationToken = previousPage.ContinuationToken, TargetNodesOnly = true, ReadVariableValues = true }; modelNext.Header = header; try { var browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext); if (string.IsNullOrEmpty(browseDataNext.ContinuationToken)) { pageResult.PageCount = previousPage.PageCount; } else { pageResult.PageCount = previousPage.PageCount + 1; } if (browseDataNext.References != null) { foreach (var nodeReference in browseDataNext.References) { previousPage.Results.Add(new ListNode { Id = nodeReference.Target.NodeId.ToString(), NodeClass = nodeReference.Target.NodeClass ?? 0, NodeName = nodeReference.Target.DisplayName.ToString(), Children = (bool)nodeReference.Target.Children, ParentIdList = parentId, DiscovererId = discovererId, AccessLevel = nodeReference.Target.AccessLevel ?? 0, ParentName = _displayName, DataType = nodeReference.Target.DataType, Value = nodeReference.Target.Value?.ToJson()?.TrimQuotes(), Publishing = false, PublishedItem = null }); } } pageResult.Results = previousPage.Results; pageResult.ContinuationToken = browseDataNext.ContinuationToken; pageResult.PageSize = _commonHelper.PageLength; pageResult.RowCount = pageResult.Results.Count; } catch (UnauthorizedAccessException) { pageResult.Error = "Unauthorized access: Bad User Access Denied."; } catch (Exception e) { // skip this node var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--"); pageResult.Error = errorMessage; } return(pageResult); }
/// <summary> /// Get tree /// </summary> /// <param name="endpointId"></param> /// <param name="id"></param> /// <param name="parentId"></param> /// <param name="discovererId"></param> /// <param name="direction"></param> /// <returns>ListNode</returns> public async Task <PagedResult <ListNode> > GetTreeAsync(string endpointId, string id, List <string> parentId, string discovererId, BrowseDirection direction) { var pageResult = new PagedResult <ListNode>(); var model = new BrowseRequestApiModel { TargetNodesOnly = true }; if (direction == BrowseDirection.Forward) { model.MaxReferencesToReturn = _MAX_REFERENCES; model.NodeId = id; if (id == string.Empty) { Path = string.Empty; } } else { model.NodeId = parentId.ElementAt(parentId.Count - 2); } try { var browseData = await _twinService.NodeBrowseAsync(endpointId, model); var continuationToken = browseData.ContinuationToken; var references = browseData.References; var browseDataNext = new BrowseNextResponseApiModel(); if (direction == BrowseDirection.Forward) { parentId.Add(browseData.Node.NodeId); Path += "/" + browseData.Node.DisplayName; } else { parentId.RemoveAt(parentId.Count - 1); Path = Path.Substring(0, Path.LastIndexOf("/")); } do { if (references != null) { foreach (var nodeReference in references) { pageResult.Results.Add(new ListNode { Id = nodeReference.Target.NodeId.ToString(), NodeClass = nodeReference.Target.NodeClass ?? 0, NodeName = nodeReference.Target.DisplayName.ToString(), Children = (bool)nodeReference.Target.Children, ParentIdList = parentId, DiscovererId = discovererId, AccessLevel = nodeReference.Target.AccessLevel ?? 0, ParentName = browseData.Node.DisplayName, DataType = nodeReference.Target.DataType, Value = string.Empty, Publishing = false, PublishedItem = null }); } } if (!string.IsNullOrEmpty(continuationToken)) { var modelNext = new BrowseNextRequestApiModel { ContinuationToken = continuationToken }; browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext); references = browseDataNext.References; continuationToken = browseDataNext.ContinuationToken; } else { browseDataNext.References = null; } } while (!string.IsNullOrEmpty(continuationToken) || browseDataNext.References != null); } catch (Exception e) { // skip this node Trace.TraceError("Can not browse node '{0}'", id); var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--"); Trace.TraceError(errorMessage); pageResult.Results.Add(new ListNode { NodeName = e.Message, DiscovererId = discovererId, ParentName = "Root" }); } pageResult.PageSize = 10; pageResult.RowCount = pageResult.Results.Count; pageResult.PageCount = (int)Math.Ceiling((decimal)pageResult.RowCount / 10); return(pageResult); }
/// <summary> /// Browse next set of references /// </summary> /// <remarks> /// Browse next set of references on the endpoint. The endpoint must be /// activated and connected and the module client and server must trust each /// other. /// </remarks> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='endpointId'> /// The identifier of the activated endpoint. /// </param> /// <param name='body'> /// The request body with continuation token. /// </param> /// <param name='cancellationToken'> /// The cancellation token. /// </param> public static async Task <BrowseNextResponseApiModel> BrowseNextAsync(this IAzureOpcTwinClient operations, string endpointId, BrowseNextRequestApiModel body, CancellationToken cancellationToken = default(CancellationToken)) { using (var _result = await operations.BrowseNextWithHttpMessagesAsync(endpointId, body, null, cancellationToken).ConfigureAwait(false)) { return(_result.Body); } }
/// <summary> /// Browse next set of references /// </summary> /// <remarks> /// Browse next set of references on the endpoint. The endpoint must be /// activated and connected and the module client and server must trust each /// other. /// </remarks> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='endpointId'> /// The identifier of the activated endpoint. /// </param> /// <param name='body'> /// The request body with continuation token. /// </param> public static BrowseNextResponseApiModel BrowseNext(this IAzureOpcTwinClient operations, string endpointId, BrowseNextRequestApiModel body) { return(operations.BrowseNextAsync(endpointId, body).GetAwaiter().GetResult()); }
/// <summary> /// Get tree /// </summary> /// <param name="endpointId"></param> /// <param name="id"></param> /// <param name="parentId"></param> /// <param name="discovererId"></param> /// <param name="direction"></param> /// <returns>ListNode</returns> public async Task <PagedResult <ListNode> > GetTreeAsync(string endpointId, string id, List <string> parentId, string discovererId, BrowseDirection direction, int index, CredentialModel credential = null) { var pageResult = new PagedResult <ListNode>(); var model = new BrowseRequestApiModel { TargetNodesOnly = true, ReadVariableValues = true }; if (direction == BrowseDirection.Forward) { model.MaxReferencesToReturn = _MAX_REFERENCES; model.NodeId = id; if (id == string.Empty) { Path = new List <string>(); } } else { model.NodeId = parentId.ElementAt(index - 1); } model.Header = Elevate(new RequestHeaderApiModel(), credential); try { var browseData = await _twinService.NodeBrowseAsync(endpointId, model); var continuationToken = browseData.ContinuationToken; var references = browseData.References; var browseDataNext = new BrowseNextResponseApiModel(); if (direction == BrowseDirection.Forward) { parentId.Add(browseData.Node.NodeId); Path.Add(browseData.Node.DisplayName); } else { parentId.RemoveAt(parentId.Count - 1); Path.RemoveRange(index, Path.Count - index); } do { if (references != null) { foreach (var nodeReference in references) { pageResult.Results.Add(new ListNode { Id = nodeReference.Target.NodeId.ToString(), NodeClass = nodeReference.Target.NodeClass ?? 0, NodeName = nodeReference.Target.DisplayName.ToString(), Children = (bool)nodeReference.Target.Children, ParentIdList = parentId, DiscovererId = discovererId, AccessLevel = nodeReference.Target.AccessLevel ?? 0, ParentName = browseData.Node.DisplayName, DataType = nodeReference.Target.DataType, Value = nodeReference.Target.Value?.ToString(), Publishing = false, PublishedItem = null }); } } if (!string.IsNullOrEmpty(continuationToken)) { bool?abort = null; if (pageResult.Results.Count > 5) { // TODO: !!! Implement real paging - need to make ux responsive for large # tags !!! abort = true; } var modelNext = new BrowseNextRequestApiModel { ContinuationToken = continuationToken, Abort = abort }; browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext); if (abort == true) { break; } references = browseDataNext.References; continuationToken = browseDataNext.ContinuationToken; } else { browseDataNext.References = null; } } while (!string.IsNullOrEmpty(continuationToken) || browseDataNext.References != null); } catch (Exception e) { // skip this node _logger.Error($"Can not browse node '{id}'"); var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--"); _logger.Error(errorMessage); string error = JToken.Parse(e.Message).ToString(Formatting.Indented); if (error.Contains(StatusCodes.Status401Unauthorized.ToString())) { pageResult.Error = "Unauthorized access: Bad User Access Denied."; } else { pageResult.Error = error; } } pageResult.PageSize = 10; pageResult.RowCount = pageResult.Results.Count; pageResult.PageCount = (int)Math.Ceiling((decimal)pageResult.RowCount / 10); return(pageResult); }