GetEndpoints
前置 / 配套
- 拉到 Endpoint 后用 构造函数 真正建立 Session.
- 跨服务发现请用 FindServers.
签名
public static IReadOnlyList<EndpointDescription> Discovery.GetEndpoints(string serverUrl);
通过临时 SecureChannel (None mode) 连服务端, 拉 Endpoint 列表后立即断开. 不需要 Session.
EndpointDescription 字段
| 字段 | 类型 | 说明 |
|---|---|---|
EndpointUrl | string | 实际 endpoint URL |
SecurityMode | MessageSecurityMode | None / Sign / SignAndEncrypt |
SecurityPolicyUri | string | 算法套件 URI |
ServerCertificate | byte[] | 服务端证书 (DER) |
UserIdentityTokens | IReadOnlyList<UserTokenPolicy> | 支持的登录方式 |
TransportProfileUri | string | 传输 Profile (通常 UA-TCP) |
SecurityLevel | byte | 服务端推荐优先级 |
UserTokenPolicy 字段
| 字段 | 说明 |
|---|---|
PolicyId | 服务端给的 ID, 客户端激活时传回 |
TokenType | Anonymous / Username / Certificate / Issued |
IssuedTokenType | (Issued 才有) JWT / SAML / OAuth2 等 |
IssuerEndpointUrl | (Issued 才有) Token Issuer 端点 |
SecurityPolicyUri | Token 自身的加密 (可与通道不同) |
用法
var endpoints = Discovery.GetEndpoints("opc.tcp://server:4840");
Console.WriteLine($"Server has {endpoints.Count} endpoints:");
foreach (var ep in endpoints)
{
Console.WriteLine($"\n URL: {ep.EndpointUrl}");
Console.WriteLine($" Mode: {ep.SecurityMode}");
Console.WriteLine($" Policy: {ep.SecurityPolicyUri}");
Console.WriteLine($" Tokens:");
foreach (var t in ep.UserIdentityTokens)
Console.WriteLine($" - {t.TokenType} (PolicyId={t.PolicyId})");
}
典型输出
Server has 4 endpoints:
URL: opc.tcp://server:4840
Mode: None
Policy: http://opcfoundation.org/UA/SecurityPolicy#None
Tokens:
- Anonymous
URL: opc.tcp://server:4840
Mode: Sign
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- Anonymous
- Username
URL: opc.tcp://server:4840
Mode: SignAndEncrypt
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- Username
- Certificate
服务端通常暴露多个组合 (None / Sign / SignAndEncrypt × Anonymous / Username / Certificate), 客户端按需求挑.
异常
| 异常 | 含义 |
|---|---|
OpcUaException(BadCommunicationError) | 网络 / 服务端不可达 |
OpcUaException(BadServiceUnsupported) | 服务端不支持 Discovery (罕见) |