in src/Microsoft.Azure.SignalR.AspNet/HubHost/ServiceMessageBus.cs [65:124]
private async Task WriteMessage(IServiceConnectionContainer connection, AppMessage appMessage)
{
var message = appMessage.Message;
try
{
switch (message)
{
// For group related messages, make sure messages are written to the same partition
case JoinGroupWithAckMessage joinGroupMessage:
try
{
await connection.WriteAckableMessageAsync(joinGroupMessage);
}
finally
{
_ackHandler.TriggerAck(appMessage.RawMessage.CommandId);
}
break;
case LeaveGroupWithAckMessage leaveGroupMessage:
try
{
await connection.WriteAckableMessageAsync(leaveGroupMessage);
}
finally
{
_ackHandler.TriggerAck(appMessage.RawMessage.CommandId);
}
break;
case ConnectionDataMessage connectionDataMessage:
var connectionId = connectionDataMessage.ConnectionId;
if (_clientConnectionManager.TryGetClientConnection(connectionId, out var clientConnection))
{
// If the client connection is connected to local server connection,
// send back directly from the established server connection
await clientConnection.ServiceConnection.WriteAsync(connectionDataMessage);
}
else
{
await connection.WriteAsync(message);
}
break;
default:
await connection.WriteAsync(message);
break;
}
if (message is IMessageWithTracingId msg && msg.TracingId != null)
{
MessageLog.SucceededToSendMessage(_logger, msg);
}
}
catch (Exception ex)
{
if (message is IMessageWithTracingId msg && msg.TracingId != null)
{
MessageLog.FailedToSendMessage(_logger, msg, ex);
}
throw;
}
}