Skip to content

C# 服务端 API ​

生产 server 路径持有 Rust-backed listener 和已接受的 runtime session:

  1. 在用户侧 NNRP endpoint 上监听。
  2. 通过所持 provider listener set 中任一 listener 接受 session。
  3. 接收 NnrpServerOperation。
  4. 发送 progress、partial、terminal、drop 和 trace 输出。
  5. 关闭已接受 session 和 listener。

NnrpServer.ListenAsync ​

csharp
public static ValueTask<NnrpServer> ListenAsync(
    NnrpServerOptions options,
    CancellationToken cancellationToken = default);

该方法解析 policy 允许的全部已注册 provider,原子绑定 listener set,并把每个 listener ownership 交给对应 native server runtime。它不会创建托管 loopback server。

NnrpServerOptions ​

属性类型必填说明
EndpointNnrpEndpoint是nnrp:// 或 nnrps:// 应用 endpoint。
ProviderRoutesIReadOnlyDictionary<TransportId, NnrpServerProviderRoute>?否按 carrier 隔离的 bind locator 与 server security。
TransportPolicyTransportPolicy否默认 Auto。
SessionDefaultsNnrpServerSessionOptions?否应用到每个 accepted session 的默认值。

TCP 与 QUIC 可以从 Endpoint 派生 bind host 和 port。IPC 与 WebSocket 必须提供匹配的 provider-local locator。Auto/Prefer 要求全部允许的已安装 provider route 都能解析,并原子打开完整 listener set;Force 限制该集合且不回退。

NnrpServerSessionOptions ​

属性类型默认值说明
SupportedProfilesIReadOnlyList<ushort>标准 token profile支持的 profile id。
SupportedCacheObjectsIReadOnlyList<CacheObjectKind>空支持的 cache object kind。
MaxCacheObjectsulong0Cache object 数量上限;零表示不声明限制。
MaxCacheObjectBytesuint0单个 object 字节上限;零表示不声明限制。
SchemaRegistryNnrpSchemaRegistry标准应用侧 schema registry。
ResumeTokenBytesuint24Runtime 签发的 recovery token 长度。
MaxInFlightOperationsushort4协商的 in-flight operation 上限。
GrantedOperationCreditushort2初始 operation credit。
LeaseTtlMillisecondsuint30000Cache lease 生命周期。
ResumeWindowMillisecondsuint120000Recovery ticket 有效窗口。
ApplicationPolicyINnrpServerSessionPolicy接受有效 session异步 admission policy。
csharp
public interface INnrpServerSessionPolicy
{
    ValueTask<NnrpServerSessionPolicyDecision> EvaluateAsync(SessionOpenMetadata open);
}

NnrpServerSessionPolicyDecision 包含 Accepted、SessionErrorCode 和可选 Diagnostic。Policy 对每个 SESSION_OPEN 恰好执行一次,且不能在 native callback 线程内运行;host 通过 Rust ABI completion 边界回报 decision。拒绝必须使用有效的非零 session error code,异常会转换为确定性的 policy failure。

NnrpServer.AcceptAsync ​

csharp
public ValueTask<NnrpServerSession> AcceptAsync(
    NnrpServerAcceptOptions? options = null,
    CancellationToken cancellationToken = default);

NnrpServerAcceptOptions 只包含默认值为 0 的 TimeoutMilliseconds。Native accept ticket、session handle 和 generation 都是内部实现。返回的 session 持有自己的 native session handle,并保留选中 provider identity。

NnrpServerSession.ActiveTransportId 是实际接受 carrier 的 listener 对应的 TransportId。它必须与协商得到的 active transport 一致,不能从 listener preference 顺序推断。

NnrpServer.BoundProviderEndpoints 是包含每个已打开 listener 实际 endpoint 的 IReadOnlyDictionary<TransportId, NnrpProviderEndpoint>。Provider listener 的致命失败会让逻辑 server 失败并关闭其余 listener set;被拒绝的 peer handshake 只影响该 accepted carrier。

NnrpServerSession.ReceiveSubmitAsync ​

csharp
public ValueTask<NnrpServerOperation> ReceiveSubmitAsync(
    CancellationToken cancellationToken = default);

返回 operation 暴露 owned 应用值,不暴露 FFI buffer:

属性类型说明
OperationIdulong非零 wire operation identity。
FrameIduintWire frame identity。
MetadataFrameSubmitMetadata已解码 submit metadata。
BodyReadOnlyMemory<byte>Owned submit body。
TraceIdulongE2E trace identity。

Operation 结果 ​

方法消息说明
SendResultAsync(ResultPushMetadata, ReadOnlyMemory<byte>, CancellationToken)ResultPush发送该 operation 的终态成功/错误 payload。
SendResultDropAsync(ResultDropReasonMetadata, ReadOnlyMemory<byte>, CancellationToken)ResultDropReason发送 typed 终态丢弃证据。
SendProgressAsync(ProgressMetadata, ReadOnlyMemory<byte>, CancellationToken)Progress发送该 operation 的非终态进度。
SendPartialResultAsync(PartialResultMetadata, ReadOnlyMemory<byte>, CancellationToken)PartialResult发送该 operation 的增量结果。

一个 operation 只能发送一次终态。终态后或 session 关闭后再次发送会抛出 NnrpNativeInvalidStateException。所有方法都会校验 operation identity,session 不暴露并行的 operation 回复方法。

收到终态 lifecycle event 不会在终态回复成功前使 operation 失效。operation 会保持可回复,直到 终态回复成功或 session 关闭,后续 event 读取不得改变这段生命周期。

Server Runtime 方法 ​

每个方法都通过一次粗粒度 native 调用发送 typed Preview4 frame。

方法消息Tail
SendBackpressureAsync(PressureMetadata, CancellationToken)Backpressure无
SendCreditUpdateAsync(PressureMetadata, CancellationToken)CreditUpdate无
NegotiateCapabilitiesAsync(CapabilityMetadata, ReadOnlyMemory<byte>, CancellationToken)CapabilityNegotiationcapability entry
DegradeProfileAsync(CapabilityMetadata, ReadOnlyMemory<byte>, CancellationToken)DegradeProfilecapability entry
SendTraceContextAsync(TraceContextMetadata, ReadOnlyMemory<byte>, ulong?, CancellationToken)TraceContexttrace attribute;null operation 表示 session scope
SendRecoverableErrorAsync(RecoverableErrorMetadata, ReadOnlyMemory<byte>, CancellationToken)ErrorRecoverable诊断字节
SendRetryAfterAsync(RetryAfterMetadata, ReadOnlyMemory<byte>, CancellationToken)RetryAfter诊断字节
SendControlAsync(MessageType, IRuntimeControlMetadata, ReadOnlyMemory<byte>, CancellationToken)任意 server 可发送且不属于具体 operation 的 runtime control声明的 tail

Server Object 与 Cache 方法 ​

方法消息
DeclareObjectAsyncObjectDeclare
ReferenceObjectAsyncObjectRef
ReleaseObjectAsyncObjectRelease
PatchObjectAsyncObjectPatch
SendObjectDeltaAsyncObjectDelta
ReferenceCacheAsyncCacheReference
ReportCacheMissAsyncCacheMiss
InvalidateCacheAsyncCacheInvalidate

参数和 tail 规则与客户端 object/cache 方法使用同一套 typed metadata 契约。

输入 Server Event ​

NextEventAsync(CancellationToken) 返回 ValueTask<NnrpServerEvent>,并保持单个 session 的事件顺序。 NnrpServerEvent.Kind 为 Submit、Runtime 或 Lifecycle;其 Match<TResult>(...) 要求提供全部三个 callback,并且只暴露一个 NnrpServerOperation、非 submit NnrpRuntimeEvent 或不带 header 的 NnrpOperationLifecycleEvent。应用 API 不接受 raw control code。

关闭 ​

NnrpServerOperation、NnrpServerSession 和 NnrpServer 按这个顺序执行 ownership 约束。 Session 和 listener 实现 IAsyncDisposable;listener 关闭会取消 pending accept、关闭已接受 session 并释放 provider runtime。

托管 INnrpMessageTransport server helper 只属于诊断/自定义 carrier,不是生产 fallback。

NNRP Documentation