public async ValueTask <(IMessage response, bool handled)> HandleAsync(
                Route route,
                IMessage request,
                bool publish,
                bool localDispatch,
                CancellationToken cancellation)
            {
                if (route == null)
                {
                    throw new ArgumentNullException(nameof(route));
                }

                if (request == null)
                {
                    throw new ArgumentNullException(nameof(request));
                }

                var messageType = _typeConversion.DeserializeType(route.ToString());

                Assert(messageType != null);

                var dispatchData = _remoteMessageDispatcher.DeserializeDispatchData(request);

                // We allow target route descend on publishing only (See https://github.com/AI4E/AI4E/issues/82#issuecomment-448269275)
                var(dispatchResult, handlersFound) = await _remoteMessageDispatcher.TryDispatchLocalAsync(
                    dispatchData,
                    publish,
                    allowRouteDescend : publish,
                    localDispatch,
                    cancellation);

                var response = new Message();

                _remoteMessageDispatcher.SerializeDispatchResult(response, dispatchResult);
                request.PushFrame();

                return(response, handled : handlersFound);
            }