Files
histsdk/docs/reverse-engineering/wcf-status-localhost.md
T
Joseph Doherty 2246fdd395 docs: reclassify M1a R1.1/R1.3 as blocked on 2020 WCF
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>
2026-06-20 15:22:53 -04:00

2.4 KiB

WCF Status Evidence

Commands:

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.