dotnet/aspnetcore · error · Error
Invalid SequenceId for Ack message.
Error message
Invalid SequenceId for Ack message.
What it means
An Ack message (type 8) is part of the reliable-transport extension and carries a numeric `sequenceId` that the receiver acknowledges. A non-numeric sequenceId breaks the contiguous-sequence contract used to detect lost or duplicated messages.
Source
Thrown at src/SignalR/clients/ts/signalr/src/JsonHubProtocol.ts:123
throw new Error("Invalid payload for StreamItem message.");
}
}
private _isCompletionMessage(message: CompletionMessage): void {
if (message.result && message.error) {
throw new Error("Invalid payload for Completion message.");
}
if (!message.result && message.error) {
this._assertNotEmptyString(message.error, "Invalid payload for Completion message.");
}
this._assertNotEmptyString(message.invocationId, "Invalid payload for Completion message.");
}
private _isAckMessage(message: AckMessage): void {
if (typeof message.sequenceId !== 'number') {
throw new Error("Invalid SequenceId for Ack message.");
}
}
private _isSequenceMessage(message: SequenceMessage): void {
if (typeof message.sequenceId !== 'number') {
throw new Error("Invalid SequenceId for Sequence message.");
}
}
private _assertNotEmptyString(value: any, errorMessage: string): void {
if (typeof value !== "string" || value === "") {
throw new Error(errorMessage);
}
}
}
View on GitHub (pinned to 294cab2f9b)
Solutions
- Ensure both client and server run SignalR versions that agree on reliable-session support.
- Confirm the server emits sequenceId as a JSON number, not a string.
- Disable reliable sessions on the server if the client does not support them, or upgrade the client.
- Inspect the raw ack message with logMessageContent:true.
Example fix
// before
{ "type": 8, "sequenceId": "5" }
// after
{ "type": 8, "sequenceId": 5 } Defensive patterns
Strategy: type-guard
Validate before calling
function validAck(m: any): boolean {
return m?.type === 8 && typeof m.sequenceId === 'number';
} Type guard
function isAckMessage(m: any): m is { type: 8; sequenceId: number } {
return m?.type === 8 && typeof m.sequenceId === 'number';
} Prevention
- Ensure sequenceId is serialized as a JSON number on both ends.
- Align client/server versions so reliable-session support is consistent.
- Disable reliable sessions if either side cannot emit numeric sequenceIds.
When it happens
Trigger: Server sends {"type":8,"sequenceId":"5"} (string) or omits sequenceId while reliable sessions are negotiated. Occurs when only one side enables the reliable protocol feature.
Common situations: Client/server version skew where one side supports reliable sessions (ack/sequence) and the other sends a malformed ack, or a hand-built server emitting a string sequenceId.
Related errors
- Invalid SequenceId for Sequence message.
- Invalid input for JSON hub protocol. Expected a string.
- Invalid payload.
- Invalid payload for StreamItem message.
- Invalid payload for Completion message.
AI-assisted analysis of dotnet/aspnetcore@294cab2f9b (2026-08-06).
Data as JSON: /api/errors/a47bdbd021f637b9.
Report an issue: GitHub.