in src/Microsoft.Azure.SignalR/ClientConnections/ClientConnectionContext.cs [459:500]
internal async Task ProcessConnectionDataMessageAsync(ConnectionDataMessage connectionDataMessage)
{
try
{
#if !NET8_0_OR_GREATER
// do NOT write close message until net 8 or later.
if (connectionDataMessage.Type == DataMessageType.Close)
{
return;
}
#endif
if (connectionDataMessage.IsPartial)
{
var owner = ExactSizeMemoryPool.Shared.Rent((int)connectionDataMessage.Payload.Length);
connectionDataMessage.Payload.CopyTo(owner.Memory.Span);
// make sure there is no await operation before _bufferingMessages.
_bufferedMessages.Enqueue(owner);
}
else
{
long length = 0;
foreach (var owner in _bufferedMessages)
{
using (owner)
{
await WriteToApplicationAsync(new ReadOnlySequence<byte>(owner.Memory));
length += owner.Memory.Length;
}
}
_bufferedMessages.Clear();
var payload = connectionDataMessage.Payload;
length += payload.Length;
Log.WriteMessageToApplication(Logger, length, connectionDataMessage.ConnectionId);
await WriteToApplicationAsync(payload);
}
}
catch (Exception ex)
{
Log.FailToWriteMessageToApplication(Logger, connectionDataMessage, ex);
}
}