mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-29 15:11:53 +08:00
# Description
Adds `MinimalClient`, a compact console OPC UA application demonstrating
the unified dependency-injection surface, secure endpoint discovery,
managed sessions, fluent V2 subscriptions, and Alarms & Conditions
support.
## Changes
- Adds `ConfigureApplication(options => ...)` to build and validate one
shared `ApplicationConfiguration` for combined client/server hosts.
- Extends `OpcUaClientOptions` so the existing `AddClient(options =>
...)` callback accepts application identity, PKI, and
certificate-validation settings like `AddServer(...)`.
- Composes root `ConfigureApplication(...)` values with client defaults
in either registration order; shared values take precedence and client
values fill gaps.
- Keeps server samples on their established `AddServer(...)`
configuration pattern.
- Adds `MinimalClient` as a .NET 10 Native AOT console application using
top-level statements and `HostApplicationBuilder`.
- Discovers a `SignAndEncrypt` / `Basic256Sha256` endpoint by default;
`--insecure` and `--auto-accept` are explicit opt-ins with warnings.
- Demonstrates fluent `AddSubscription(...)`,
`TryAddMonitoredItem(...)`, and `AlarmClientFactory` usage.
- Adds targeted configuration, client, and combined client/server tests.
## Example
```csharp
builder.Services
.AddOpcUa()
.AddClient(options =>
{
options.ApplicationName = "MinimalClient";
options.ApplicationUri = "urn:localhost:OPCFoundation:MinimalClient";
options.ProductUri = "uri:opcfoundation.org:MinimalClient";
options.Session = new ManagedSessionOptions
{
SessionName = "MinimalClient",
SessionTimeout = TimeSpan.FromSeconds(60)
};
})
.AddDiscoveryAndConnect(options =>
{
options.DiscoveryUrl = discoveryUrl;
options.SecurityMode = MessageSecurityMode.SignAndEncrypt;
options.SecurityPolicyUri = SecurityPolicies.Basic256Sha256;
})
.AddSubscriptions()
.AddAlarms();
```
## Related Issues
_If there is no issue yet, open one and link it here._
## Checklist
- [ ] I have signed the
[CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf)
and read the
[CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md)
doc.
- [x] I have added tests that prove my fix is effective or that my
feature works and increased code coverage.
- [x] I have added all necessary documentation.
- [x] I have verified that my changes do not introduce new build or
analyzer warnings.
- [ ] I ran all tests locally using the `UA.slnx` solution against at
least .NET Framework and .NET 10.
- [ ] I fixed all failing and flaky tests in the CI pipelines and all
CodeQL warnings.
- [x] I have addressed all PR feedback received.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <romanett98@gmail.com>
Co-authored-by: Marc Schier <marcschier@hotmail.com>
106 lines
5.0 KiB
Markdown
106 lines
5.0 KiB
Markdown
# OPC Foundation UA .NET Standard Minimal Client
|
|
|
|
## Introduction
|
|
|
|
The minimal console client demonstrates a clean, lightweight OPC UA client implementation using the modern fluent API and dependency injection with `HostApplicationBuilder`. It is designed as an educational reference and starting point for building OPC UA client applications.
|
|
|
|
## Key Features
|
|
|
|
- **Fluent DI API**: Uses `HostApplicationBuilder` with fluent `.AddOpcUa()`, `.AddClient()`, `.AddSubscriptions()`, and `.AddAlarms()` configuration
|
|
- **Secure by Default**: Discovers a `SignAndEncrypt` / `Basic256Sha256` endpoint unless `--insecure` is explicitly supplied
|
|
- **Managed Sessions**: Leverages the modern `IManagedSessionFactory` for simplified session management
|
|
- **Fluent Subscriptions**: Creates a V2 subscription and monitored item with `AddSubscription()` and `TryAddMonitoredItem()`
|
|
- **Dependency Injection**: Fully integrated Microsoft.Extensions.DependencyInjection with host-based lifetime management
|
|
- **Service-Provided Telemetry**: Uses the DI-integrated `ITelemetryContext` for logging, metrics, and activity tracking
|
|
- **Alarms & Conditions**: Includes A&C client support via `.AddAlarms()`
|
|
- **Console Logging**: Integrated console logging for visibility into client operations
|
|
- **Native AOT Compatible**: Supports ahead-of-time compilation with .NET
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- .NET 10.0 SDK or later
|
|
- An OPC UA server accessible at the specified endpoint
|
|
|
|
### Running the Client
|
|
|
|
To connect to the default MinimalBoilerServer:
|
|
|
|
```bash
|
|
dotnet run
|
|
```
|
|
|
|
The server certificate must already be trusted. For local development only, explicitly opt into automatic trust:
|
|
|
|
```bash
|
|
dotnet run -- --auto-accept
|
|
```
|
|
|
|
To explicitly select an endpoint without message security:
|
|
|
|
```bash
|
|
dotnet run -- --insecure
|
|
```
|
|
|
|
To connect to a different server:
|
|
|
|
```bash
|
|
dotnet run -- "opc.tcp://localhost:62542/MinimalCalcServer"
|
|
```
|
|
|
|
## Example Usage
|
|
|
|
The minimal client demonstrates the following operations:
|
|
|
|
1. **Host Setup**: Creates an application host with `Host.CreateApplicationBuilder()`
|
|
2. **DI Configuration**: Configures the application and client services with the fluent API
|
|
3. **Endpoint Discovery**: Selects the requested secure endpoint through `.AddDiscoveryAndConnect(...)`
|
|
4. **Session Connection**: Connects through the DI-provided managed-session factory
|
|
5. **Subscriptions**: Monitors `ServerStatus.CurrentTime` with the V2 subscription API
|
|
6. **Alarms & Conditions**: Resolves `AlarmClientFactory` and creates an A&C client for the session
|
|
7. **Browsing**: Browses the server's address space (`ObjectsFolder`)
|
|
8. **Reading**: Reads the server's current time from the StandardServer
|
|
9. **Clean Shutdown**: Properly closes the subscription, session, and host
|
|
|
|
## Architecture
|
|
|
|
### Program.cs
|
|
|
|
The application uses top-level statements and demonstrates:
|
|
|
|
- Configuring application identity and security directly inside `.AddClient(...)`
|
|
- Setting up `HostApplicationBuilder` with OPC UA client services
|
|
- Building and validating the `ApplicationConfiguration` inside the DI infrastructure
|
|
- Configuring services via fluent API: `.AddOpcUa().AddClient(...).AddSubscriptions().AddAlarms()`
|
|
- Discovering a secure endpoint and connecting through the DI-provided managed-session delegate
|
|
- Creating a V2 subscription and monitored item with the fluent session extensions
|
|
- Resolving `AlarmClientFactory` for Part 9 Alarms & Conditions operations
|
|
- Performing basic OPC UA operations (Browse, Read)
|
|
- Proper resource cleanup for the subscription, session, and host
|
|
|
|
### DI Container Integration
|
|
|
|
The client follows the patterns described in [DependencyInjection.md](../../docs/DependencyInjection.md):
|
|
|
|
- **HostApplicationBuilder**: Central entry point for DI and host setup
|
|
- **Client Options**: `OpcUaClientOptions` exposes the application identity fields (`ApplicationName`, `ApplicationUri`, `ProductUri`, `AutoAcceptUntrustedCertificates`, etc.) directly alongside managed-session defaults, so a client-only host can configure everything inside `.AddClient(...)` without a separate configuration construction step
|
|
- **Factory Pattern**: `IManagedSessionFactory` for runtime endpoint selection
|
|
- **Fluent API**: Chainable `.AddXxx()` methods on `IOpcUaBuilder`
|
|
|
|
## Educational Value
|
|
|
|
This minimal client serves as:
|
|
|
|
- A clean reference implementation for building OPC UA clients with dependency injection and HostApplicationBuilder
|
|
- A learning resource for understanding the modern OPC UA client stack and fluent DI patterns
|
|
- A template matching the architecture of MinimalBoilerServer for consistency
|
|
- A starting point for custom client applications
|
|
|
|
## For More Information
|
|
|
|
- See [Sessions.md](../../docs/Sessions.md) for detailed session and subscription documentation
|
|
- See [DependencyInjection.md](../../docs/DependencyInjection.md) for DI patterns and service composition
|
|
- See [MinimalBoilerServer](../MinimalBoilerServer) for server-side HostApplicationBuilder patterns
|
|
- See [IdentityProviders.md](../../docs/IdentityProviders.md) for authentication and authorization patterns
|