2246fdd395
Live-probed both against the local Historian 2020 (WCF): - R1.3 GetServerTimeZoneAsync: Status.GetSystemTimeZoneName returns rc=0 with an empty value under a real authenticated handle — a client-side stub in the GetServerTime family. gRPC/2023R2-only. Reverted the implementation. - R1.1 ExecuteSqlCommandAsync: Retrieval.ExeC returns native error type 4 / code 51 (InvalidParameter); the contract-3 string-handle ops require an unmapped native session/filter registration step (the StartTagQuery wall). Adds an M1a re-classification note steering future work toward proven uint-handle / already-wired ops (R1.4 GETHI next) over string-handle ops. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
2.4 KiB
Markdown
51 lines
2.4 KiB
Markdown
# WCF Status Evidence
|
|
|
|
Commands:
|
|
|
|
```powershell
|
|
dotnet run --no-build --project tools\AVEVA.Historian.ReverseEngineering -- wcf-status localhost 32568
|
|
dotnet run --no-build --project tools\AVEVA.Historian.ReverseEngineering -- wcf-status localhost 32568 Version
|
|
```
|
|
|
|
Confirmed:
|
|
|
|
- The local status endpoint is `net.tcp://localhost:32568/Stat`.
|
|
- `IStatusServiceContract2` is a static WCF contract named `Stat` in namespace
|
|
`aa`. The managed definitions now include `GetSystemParameter`, `GETHI`,
|
|
`PNGS`, and `PNGP`.
|
|
- `GetInterfaceVersion` returns code `0`, version `0` on the local 2020
|
|
install.
|
|
- The decompiled `CStatusConnectionWCF.GetServerTime` implementation is a
|
|
WCF-path stub that returns success without calling the `Stat` service. The
|
|
managed direct call likewise returns code `0` with size `0` and no buffer.
|
|
|
|
Observed sanitized localhost results:
|
|
|
|
- `GetSystemTimeZoneName(handle: 0)` returns code `4` and no value.
|
|
- `IsDBCaseSensitive(handle: 0)` returns code `4`.
|
|
- `GetSystemParameter(handle: 0, "Version")` returns `false` with no error
|
|
buffer.
|
|
|
|
Re-tested 2026-06-20 with a **real authenticated client handle** (full Open2 auth
|
|
chain), not `handle: 0`:
|
|
|
|
- `GetSystemParameter(handle, "HistorianVersion")` → real version string (works;
|
|
shipped as `GetSystemParameterAsync`).
|
|
- `GetSystemTimeZoneName(handle)` → return code `0x00000000` (success) but an
|
|
**empty value string**. Same channel/handle that makes `GetSystemParameter`
|
|
return real data, so this is the op's own behavior, not an auth/marshalling
|
|
gap. `GetSystemTimeZoneName` is a member of the `GetServerTime` stub family:
|
|
the 2020 WCF path returns success without producing a value (the native client
|
|
computes the zone locally). It only becomes a real round-trip on the 2023 R2
|
|
gRPC front door (`Status.GetSystemTimeZoneName`), which is absent on this box.
|
|
|
|
Interpretation:
|
|
|
|
- `Stat` endpoint routing is confirmed, but status operations that require a
|
|
real client handle are not usable until managed session open is solved.
|
|
- `GetServerTime` should not be promoted into the public SDK as a real server
|
|
time call from this WCF path; native evidence shows it is a no-op stub here.
|
|
- **`GetServerTimeZoneAsync` (roadmap R1.3) is NOT a trivial WCF op on 2020** — it
|
|
is a stub returning empty. Do not ship it over the 2020 WCF transport. Deliver
|
|
it only against a live 2023 R2 gRPC server. Reclassified in `docs/plans/hcal-roadmap.md`.
|