dotnet/yarp · error · Exception

Expected to receive EndOfMessage = true.

Error message

Expected to receive EndOfMessage = true.

What it means

Asserted in WebSocketsScenario when a received frame's EndOfMessage flag is false. Each test message is small and sent as a single complete frame, so the echo must also arrive as a single frame with EndOfMessage true. A false flag means the frame was fragmented across reads, which the scenario does not reassemble.

Solutions

  1. Use the matching test backend that returns single complete frames.
  2. Disable WebSocket extensions (e.g. permessage-deflate) on the client or server if they cause fragmentation.
  3. Remove or reconfigure intermediaries that re-chunk frames.
  4. If you adapt the scenario, loop ReceiveAsync until EndOfMessage to support fragmentation.
Defensive patterns

Strategy: validation

Validate before calling

// If you adapt the scenario, reassemble fragmented messages instead of asserting EndOfMessage.
async Task<(string text, WebSocketMessageType type)> ReceiveFullAsync(WebSocket ws, byte[] buf, CancellationToken ct) {
    using var ms = new MemoryStream();
    WebSocketReceiveResult r;
    do {
        r = await ws.ReceiveAsync(buf, ct);
        ms.Write(buf, 0, r.Count);
        if (r.MessageType == WebSocketMessageType.Close) throw new IOException("peer closed");
    } while (!r.EndOfMessage);
    return (Encoding.UTF8.GetString(ms.ToArray()), r.MessageType);
}

Try / catch

try { await WebSocketsScenario.RunAsync(client, args, cancellation); }
catch (Exception ex) when (ex.Message.Contains("EndOfMessage")) {
    Console.Error.WriteLine("Frames arrived fragmented; disable permessage-deflate or remove re-chunking proxy.");
    return 1;
}

Prevention

When it happens

Trigger: Running WebSocketsScenario against an endpoint or intermediary that fragments a small message into multiple frames, so the first ReceiveAsync sees EndOfMessage false.

Common situations: A proxy that re-chunks WebSocket frames; an echo backend that splits messages; an extension (permessage-deflate) that changes framing; large effective frame size after compression causing fragmentation.

Related errors


AI-assisted analysis of dotnet/yarp@bd11867bee (2026-08-13). Data as JSON: /api/errors/144ef8f66db94298. Report an issue: GitHub.

Appendix: source

Thrown at testassets/TestClient/Scenarios/WebSocketsScenario.cs:48

        stopwatch.Restart();
        for (var i = 0; i < 256; i++)
        {
            var textToSend = $"Hello {i}";
            var numBytes = Encoding.UTF8.GetBytes(textToSend, buffer.AsSpan());
            await client.SendAsync(new ArraySegment<byte>(buffer, 0, numBytes),
                WebSocketMessageType.Text,
                endOfMessage: true,
                cancellation);

            var message = await client.ReceiveAsync(buffer, cancellation);
            if (message.MessageType != WebSocketMessageType.Text)
            {
                throw new Exception($"Expected to receive a text message, got '{message.MessageType}' instead.");
            }

            if (!message.EndOfMessage)
            {
                throw new Exception("Expected to receive EndOfMessage = true.");
            }

            var text = Encoding.UTF8.GetString(buffer.AsSpan(0, message.Count));
            if (text != textToSend)
            {
                throw new Exception($"Expected to receive '{textToSend}', but got '{text}'.");
            }

            Console.Write(".");
        }

        Console.WriteLine();
        Console.WriteLine($"Completed 256 text messages in {stopwatch.ElapsedMilliseconds} ms.");

        Console.WriteLine("Sending binary messages...");
        stopwatch.Restart();
        for (var i = 0; i < 256; i++)
        {

View on GitHub (pinned to bd11867bee)