Commit Graph
94 Commits
Author SHA1 Message Date
bhnaphade 32fbc8077c Propagate tracing data to RequestHeader(AdditionaHeader) (#2322)
Sample code to show how to customize a session and how to add OTEL telemetry for activities to the additional header field of a request header.
2023-12-14 20:30:01 +01:00
Martin Regen 626bdcb9b8 Fix potential deadlocks with WaitAsync on a SemaphoreSlim (#2415)
Fix cases where a cancellable WaitAsync(ct) on a SemaphoreSlim within a try/finally could end up in a deadlock.
Fix: The WaitAsync must be outside the try/finally block. if the WaitAsync is cancelled, it should not release the semaphore
2023-12-07 19:55:05 +01:00
Martin Regen 65803c4967 Implement async reconnect (#2399)
- Implement the reconnect and republish with async service calls. 

bug fixes:
- subscription Ids should start from a random number
- the keep alive interval calculation is too short, adding +1 for the timeout
- on BadSessionIdInvalid recreate session immediately 
- on a restarted server with new certificate, also reload endpoints when BadCertificateInvalid is returned
2023-11-30 21:02:51 +01:00
Martin Regen 9138bb90e0 Support for subclassing of client sessions, subscriptions and monitored items (#2384)
Currently, due to some internal cloning of sessions, subscriptions and monitored items it is not possible to use subclassed variants which are properly recreated after a session reconnect.

- Add a  `ISessionInstantiator` interface to allow to subclass a `Session` and override virtual function.
- Add a `Subscription.CloneSubscription` and `MonitoredItem.CloneMonitoredItem` virtual method to recreate those with event handlers and client handles.
- A sample implementation with `TestableXXX` classes is provided to test the BadInvalidTimestamp fix by injecting modified timestamps in the session class.
- Remove duplicate `IDisposable` with `Session`. `IClientBase` is disposable already.
- adds `knownTypes` parameter to `Session.Load` and `Session.Save` to support save and restore of custom Subscriptions and Monitored items.

bug fixes:
- IOP: an empty DataTypeDictionary throws an exception when loaded by the complex type system, server are allowed to leave it empty to save memory.
- BadInvalidTimestamp should not be returned when the timestamp in the requestheader is out of sync. #2364
2023-11-28 21:17:56 +01:00
Martin Regen a109c81d22 fix .NET 8 build and warning (#2395)
Fix some warnings and build errors with .NET 8. To build as .NET 8, add net8.0 to target.props.
2023-11-27 18:35:47 +01:00
Martin Regen 973d342b29 Implement the close async codepath (#2381)
- CloseAsync still used the 'Close' synchronous function
- remove a duplicate definition of IDisposable on ISession
- reduce the log output when the server publish time is out of sync
2023-11-17 14:41:26 +01:00
Martin Regen 4c0880c800 Fix codesmells. No functional changes and bug fixes. (#2368)
Fix many warnings to improve code quality or simplify the code.
2023-11-07 10:34:42 +01:00
Martin Regen d47bc853da Various async improvements and minor issues found in IOP testing (#2346)
- improve various log messages, comments etc.
- multiple internal improvements in naming convention handling of async functions
- add FetchSuperTypesAsync
- replace new UTFEncoding() with Encoding.UTF8 singleton
2023-10-20 21:29:03 +02:00
Marc Schier af04893a37 Fix degradation to sync calls in the SDK on main paths used. (#2316)
- make session create fully async incl. loading of the complex type system
2023-09-22 12:17:03 +02:00
Martin Regen 5af60ef6b6 Make async service call use awaitable, session open improvements (#2318)
- Improvements when many sessions need to be opened
- Introduce a OpenAsync version which usesmore async calls for session creation
- add async interfaces to cert validator 
- refactor lock of encodeable factory
- add a `EndAsync` property to WriteRequest to allow to await a service call
- add a `EndSendRequestAsync` method to allow implementation of awaitable service calls
2023-09-22 07:45:47 +02:00
bhnaphade 5d4e962315 some TraceableSession functions do not await the activity (#2294)
* added await for some TraceableSession functions
* added missing configureAwait()
2023-09-02 07:29:27 +02:00
bhnaphade da5db41a34 Publish state change does not correctly handle subscription transferred case (#2281)
If the subscription is transferred there was still try to publish on the subscription which is not active anymore and failed.
2023-08-25 20:10:22 +02:00
Martin Regen b88e2da4d8 Use the request queue to return GoodSubscriptionTransferred immediately (#2280)
Issues:
- The expectation is for a client session to receive a `GoodSubscriptionTransferred` status after a subscription is transferred to another session. However there is a corner case exposed in our tests, when all subscriptions are transferred so that the client subscriptiona has no active subscriptions left, only `BadNoSubscription` is returned by the server for allpending requests, instead of the status. As a workaround, to get the status, the client session has to send an additional publish request which is unexpected after a `BadNoSubscription` error.
- The status message is only returned on the next publish request, which can lead to undesired delay of the notification.

Fix: Return the status message immediately if pending requests are available.

Other fixes:
- Make client subscription class cloneable
- Improve the test which didn't receive the status messages
- Use the publish request queue to return a status message immediately
2023-08-25 11:29:16 +02:00
Martin Regen e02f22368d Add event for the session configuration changed (#2278)
- Add the event `SessionConfigurationChanged` which indicates that the `SaveSessionConfiguration` should be called again because some session configuration was changed, e.g. after a reconnect, locale, server nonce or the user impersonation changed.
2023-08-25 10:39:47 +02:00
bhnaphade 4e6d58e1a4 Fix for 'BadTooManyOperations' in session.publish / 'BadServerHalted' when server is stopped. (#2277)
* Fixed status code when server is shutdown
* Add latest statuscodes from 1.05.03 to support new BadServerTooBusy error code
* added default throttle delay in case an unknown error is returned on a publish request service call
2023-08-22 20:02:39 +02:00
Martin Regen 0a51dd3d02 Complete ISessionFactory interface (#2255)
- A few use cases were still missing from the ISessionFactory interface to make the static `Session.Create` functions completely obsolete. 
- Follow naming conventions (Async) and add CancellationToken where missing.
2023-08-10 16:41:36 +02:00
Martin Regen 1e535dda09 Support client activities on all target platforms (#2256)
- Add the system diagnostics library for unsupported target platforms
- Integrate in clientfixture by adding IDisposable to support to enable/disable the activity tracing
- fix Traceable session dispose issue, do not null the disposed session
2023-08-10 09:48:36 +02:00
bhnaphade cfb3ac49bf Support ActivitySource in OPC UA client to enable tracing (.NET6) (#2251)
- Add traceable client session with factory to support ActivitySource on .NET 6
- Only traces the public API calls, inner calls are not yet supported.
- Uses the name: Opc.Ua.Client-TraceableSession-ActivitySource
2023-08-04 12:11:05 +02:00
Martin Regen e6f3004d6e Improve client subscription implementation (#2245)
- shutdown the worker tasks with a ManualResetEvent instead of timer null check
- Breaking change: Decorate the PublishStateChanged event handler with state information:
- - Stopped/Recovered if publish times out/restarts
- Breaking change: PublishStateChange fired for every received publish response, which doesn`t really indicate a state change. 
-- new behavior: fires only if a Keep alive or republish is triggered.
2023-08-04 10:17:38 +02:00
Martin Regen 81340c3473 Support for session reconnect from distributed clients (#2244)
- Support Client.Session API to save and restore session configuration information as xml or in a serializable data structure.
- Support to reactivate a session using a new secure channel. 
- API tests
2023-08-03 22:27:53 +02:00
Martin Regen e61664f586 Truncate inner diagnostics if nested depth too high (#2247)
- `DiagnosticInfo` contains the `InnerDiagnosticInfo` which can be nested. Limit the recursion to `MaxInnerDepth` in multiple places to prevent stack overflow / endless loops.
- The default value for MaxInnerDepth should not be more than 5.
2023-07-31 16:11:40 +02:00
Martin Regen c64eb53509 Fix corner cases of subscription transfer (#2227)
- With the `sequentialPublishing` flag enabled, no data is received after transfer. Fix: add a resync flag to update the last sequence counter after transfer.
- Instead of the semaphore slim use a dedicated Task per subscription. The task  is using `AsyncAutoResetEvent` to be task friendly, becasue every subscription gets a worker task.
- Add more tests for the use case republish with delayed ack.
- Add a test and a missing method to support reconnect of a session on a different secure channel without reconnect handler.
2023-07-21 13:10:00 +02:00
Marc Schier d99c4bc9fa Add Filter Result property to monitored item status (#2219)
Adds a property to the monitored item status to expose the filter result returned from the server.
2023-07-14 06:00:30 +02:00
Martin Regen 17d4f0475f Fix stringtables for diagnostic results when service calls are batched (#2222)
- Issue fix: Currently when diagnostics is enabled in client calls, the string table in the response header is not updated when a service call is split into multiple service calls.  In this case the stringtables from all calls must be appended and the index in the diagnosticinfo must be updated to match the updated string list.
- To reduce the number of 'null' DiagnosticInfo allocations, the decoders now try to return null instead of a default DiagnosticInfo. A new property ÌsNullDiagnosticInfo' can be used to check for unused DiagnosticInfo entries.
- The tests were slightly improved to use test set data from the generated TestData namespace, which contains also a historical node.
- All `ServerFixtureUtils.ValidateXXX` checks were updated to include the check for diagnosticInfos and the string tables to catch issues.
2023-07-13 19:18:24 +02:00
Martin Regen cd38eca781 Various bugfixes for CTT and others (#2212)
- SessionClientBatched doesn't handle the case when diagnosticinfos are requested and the batched calls returns mixed empty or non empty diagnostic infos, then the returned infos did not match the number of requested items.
- write of arrays of analogItemState are not properly checked
- BuildInfo properties were empty because BuildInfoVariableValue is never initialized
- DataType and ReferenceType may return null attributes instead of BadAttributeIdInvalid.
- Add BuildInfo test and fix the NodeCacheTest
2023-07-04 16:44:06 +02:00
Martin Regen ae00175fe8 Merge branch 'master' into master371_temp 2023-06-27 10:01:34 +02:00
Martin Regen 1dfda2bf3b Make client NodeCache thread safe (#2201)
-Add a readwritelockslim to NodeCache functions which access the underlying NodeTable and TypeTree, to support multi threading
2023-06-27 09:53:23 +02:00
Martin Regen 85c032133b Fix session reconnect exponential backoff (#2185)
- With exponential backoff enabled, a KeepAlive calling `BeginReconnect` could retrigger the timer in a way that a reconnect would never occur.
- Throttle `ISession.BeginPublish` on `BadTooManyOperations` error.
- Add reverse connect option to console client to test reconnect with reverse connect manager.
- null events in session on dispose to suppress spurious events.
- mark `TransferSubscription` service calls obsolete to avoid accidential use by applications.
- for reverse connection testing of session reconnect handler, add options for no security and reverse connect endpoint to console client
2023-06-20 09:40:43 +02:00
Martin Regen e89b06e57b Add metadata to fast data and event callbacks notification. (#2176)
- if `DisableMonitoredItemCache` is set, the sequencenumber and publish time are unavailable. Add helpers to NotificationData to get the information in the fast data and event callbacks.
- new fast callback for keep alive messages
2023-06-14 09:47:21 +02:00
Andreas Heisel 266e29b383 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.
2023-06-01 10:20:55 +02:00
Martin Regen 043a56c3f2 Deprecate .NET framework 4.6.2 support, sync with samples repo (#2165)
- Deprecate support for Nuget package support of .NET Framework 4.6.2
- Bump sample applications to 4.8
- update some copyright headers / supporting files (editorconfig etc.)
- fix a few warnings
- fix an issue with `SessionReconnectHandler`, in certain combination of reconnect period and exponential backoff the .NET sample app never reconnected.
2023-05-31 18:53:56 +02:00
Martin Regen d8f8a4e7ad Merge pull request #2163 from OPCFoundation/master371
Merge release 1.4.371.91 in master
2023-05-27 05:52:47 +02:00
Martin Regen a81a6961bd fix regression after reconnect and explain session dispose after reconnect (#2160)
- due to the new `MinPublishRequestCount` property publish requests are being sent after reconnect even if no subscription is active
- Improve sample code to show how to dispose the old session after reconnect
2023-05-24 08:14:44 +02:00
Martin Regen 7550c65452 Refactor Sessionreconnecthandler and support subscription ack deferral (#2143)
Currently the session reconnect requires to create and destroy the object and to lock the operation in the client code.
The refactored version is backward compatible but allows for a single instance to handle reconnects during the lifetime of the client. In addition no more locking is necessary in the client code.
- exponential backoff is enabled by using a constructor  `new SessionReconnectHandler( true, 30000);` which would set the maxReconnectPeriod` to 30000ms. The backoff period is doubled after every unsuccessful request.
- a 10% random jitter is added to every timer update.
- The `public virtual int JitteredReconnectPeriod(int reconnectPeriod)` and `public virtual int CheckedReconnectPeriod(int reconnectPeriod, bool exponentialBackoff = false)` can be overloaded to implement custom jitter and backoff implementations.
- A new `ISession.MinPublishRequestCount` property can be set to enforce a minimum number of active publish requests. Default behavior is one publish request per subscription. It can help for low latency high frequency publish intervals.
-  A new `PublishSequenceNumbersToAcknoledge` event is implemented which allows to defer ack of sequence numbers until fully processed by the client.
All new methods/properties ar not breaking changes and by default there is no behavior change, all existing code should work and compile aginst the update flawlessly.
- A bugfix in the reconnect handler, when a server changed the application certificate the reconnect ends up in an endless loop, because the `EndpointDescription` is not updated. The fix updates the endpoint from the server if a `BadSecurityChecksFailed` error os returned and then tries to reconnect with a new session.
2023-05-19 15:24:28 +02:00
Martin Regen c13bb0e600 Fix possible memory leak of CancellationTokenSource (#2156)
Fix a few cases (not all) where TCS are not properly disposed. Specifically BeginConnect, which may cause resource leaks.
2023-05-19 15:19:04 +02:00
Martin Regen 24845eb69d Use ICloneable in generated code (#2044)
- ICloneable was removed from generated code for the first port to .NET Standard 1.x, instead MemberwiseClone was used
- Reenable ICloneable for generated code
- Add ICloneable to built in types
- Fix code where MemberwiseClone is called instead of Clone
2023-04-27 11:08:13 +02:00
Martin Regen 620e7c42eb Session.Load doesn't create the monitored items. Opt-in to support load for subscription transfer. (#2113)
- Added a flag to the Session.Load function to indicate that a session transfer should be supported. Otherwise the serverId is reset after load, to support that the subscription is recreated on the server after load. 
- A user has to opt-in to get the transfer session support.
2023-04-11 08:45:34 +02:00
Martin Regen dd51122bde Improve INodeCache API, error handling (#2016)
* INodeCache lacks an interface to directly call `IList<INode> Find(IList<ExpandedNodeId> nodeIds);`
* Handle a special case where a `BadNothingToDo` error would disrupt the Fetch for NodeCache.
2022-12-09 14:51:39 +01:00
Martin Regen ea8ceb6d59 Only load optional bindings assemblies if needed (#1963)
-Currently the server startup tries to load bindings for all known schemes, even if no baseaddress was specified.
Filter the required schemes to load only if necessary.
-Make GetDiscoveryUrl helper public
2022-11-01 11:47:12 +01:00
Martin Regen da1b1a7112 Add Session.CloseAsync, fix UANodesetHelper.Save (#1944)
-Add Session.CloseAsync methods.
-Add missing Close signatures to ISession
-Mark the CloseSession service call as obsolete to prevent invalid usage
-fix UANodeSetHelper.Save(stream), to not close the stream
-fix a deadlock in the ref server app, due to the new default behavior of the cert validator not caching the approved certificates
2022-10-11 11:03:00 +02:00
Ivan van Heerden 1f2a30d7ca Add abstraction 'ISession' for Session object in the Client library (#1702)
Expose an 'ISession' interface as abstraction to ease unit testing. 

Breaking changes are kept to minimal impact, but some changes maybe required to use ISession objects instead of Session.

Note: ISessionClientMethods is hand created, not yet by ModelCompiler
2022-10-07 20:11:53 +02:00
Martin Regen 1fec89b073 Complex types improvements (#1915)
Improvements for complex types.

- Support to encode/decode complex type structures with multidimensional arrays.
- Perf improvements for type loader using new NodeCache fetch multiple interfaces.
- DataTypeDictionary validation when dependencies are used.
- interface for complex type resolver, to build custom types in code.
- improvements of console client to demonstrate browse/read of custom values

+++ Breaking changes +++

IDecoder interface change of the `ReadArray` method

- Return type is now `Array` for all types of arrays. Previously the method returned an array for 1-dim and a `Matrix` type for multidimensional arrays. In addition the convention in generated code is to use `Collection` for all 1-dim arrays, and so was built the `BaseComplexType`. The new convention is to expose the native `Array` type from a complex type, in all cases, hence the return type of `ReadArray` was changed to reflect that for a consistent programming model.
- `ReadArray` has a new parameter `systemType` to efficiently read encodeable types. Previously the `Type` of an encodeable was determined by the encodingid and lookup in the type factory, even when the Type is already known by the caller.  The 'old' style is still supported.
- `ReadArray` supports to read encodeable type arrays which are directly encoded in structures. These arrays differ from standard encoding of arrays and they are handled when `BuiltInType.Null` is used as parameter.
2022-10-04 19:45:26 +02:00
Martin Regen f273634d74 Improve https transport and other bug fixes (#1908)
-Make the https callbacks fully async / code cleanup. 
-Default https client to use MaxConnectionsToServer = 64 for #1550
-Fix https missing reconnect error code
other fixes unrelated to https:
- move trust list audit event to AuditEvents.cs, fix issue that the event is not filtered since reportAuditEvent cannot be used
- fix an issue when BrowseNext for multiple continuation tokens doesn't add the results array properly
- bump up .NET Core 3.1 Nuget dependencies
- improve .NET reference client app for use with https
2022-08-20 23:44:09 +02:00
Martin Regen dd78c0be93 Client perf updates for NodeCache and service call layer to batch Operation Limits. (#1876)
- Add methods to support to Read/Browse multiple nodes in session and NodeCache.
- Add methods to find references of multiple nodes in NodeCache.
- By default the client fetches the operation limits from the server.
- Add operation limit object to client config, settings are overwritten by server limits if server limits are smaller.
- Split client service calls if operation limits are exceeded with an override of the SessionClient. All sync/async service calls are implemented, but not the servcie calls using the Begin/End pattern.
2022-08-08 11:43:55 +02:00
Vincenzo CarlinoandMartin Regen cf0c878283 Add methods for reading multiple nodes (#1522)
* Add new methods for reading a set of nodes
* ReadNodes(NodeIdCollection, out DataValueCollection, out IList<ServiceResult>, bool optionalAttributes)
* (DataValueCollection, IList<ServiceResult>) ReadNodesAsync (NodeIdCollection, bool optionalAttributes)
to reduce the amount of attributes read from a server ReadNodes first reads only the NodeClass, then reads only the mandatory attributes per nodeclass to reduce the overall number of attributes to read.
If the NodeClass of all nodes is already known, the read can be further optimized to read only the attributes for a known class:
* ReadNodes(NodeIdCollection, NodeClass, out DataValueCollection, out IList<ServiceResult>, bool optionalAttributes)
* (DataValueCollection, IList<ServiceResult>) ReadNodesAsync (NodeIdCollection, NodeClass, bool optionalAttributes)
to complete async and collection operation, there is a:
* ReadNodeAsync and 
* ReadValues/ReadValuesAsync

* An issue was fixed in the https async codepath, the security header was not properly set in async operation

sidenote: operation limits must be handled by caller!

Co-authored-by: Martin Regen <mregen@microsoft.com>
2022-07-17 06:19:11 +02:00
Martin Regen 8fc68e3fbc return value also for uncertain (#1861) 2022-07-01 09:19:57 +03:00
Martin Regen f345f909b6 merge master 2022-05-13 07:56:31 +02:00
Martin Regen fd9a91afe7 Fix issues with reconnect handler and subscription transfer (#1802)
- set `KeepAliveTimeout` default back to 5s, was unintentionally set to 50s in 368 release
- fix a bug that duplicate subscriptions were created after reconnect when transfer succeeds.
- add a property to enable subscription transfer in reconnect, set `Session.TransferSubscriptionsOnReconnect=true` to enable, IOP issues may not allow to use it with some servers.
- add a `SessionReconnectHandler(true)` constructor to support reconnect abort, if the connection recovers before reconnect timer called. If the new constructor is used, its a breaking change: Needs check of  `Session` property in Reconnect handler callback, if aborted `Session==null`.
- Reduce warning log output if server timestamp > client time.
- Add handling when subscriptions can not be transferred, e.g. when false user credentials or no security prevent transfer.
- Improve the reconnect timer handling by using `OperationLimit` in reconnect.
- Add sample for `SessionReconnectHandler` in console client.
- Seperate session sample code from `UAClient`.
- Tested on popular demo servers of various SDK vendors.
- Fix Winforms ref client
2022-05-11 22:28:07 +02:00
niveditha-sooda fa523b905a Changed the access modifiers for a few client session members (#1737)
-change to the access modifiers for some of the members in the Session class and a method in the DataDictionary class to support custom solution.
2022-04-01 15:32:59 +02:00
Zigby cbe886dcb0 Enable client support for multiple sessions on a single channel (#1659)
* Client API changes to support multiple sessions on a single channel
* Tested against freeopcua:python:server and ProSys simulation server
2022-04-01 14:27:32 +02:00