コード例 #1
0
        public async ValueTask <IReadOnlyCollection <IMessage> > RouteAsync(
            RouteHierarchy routes,
            IMessage serializedMessage,
            bool publish,
            CancellationToken cancellation)
        {
            if (routes == null)
            {
                throw new ArgumentNullException(nameof(routes));
            }

            if (routes.Any(p => p == null))
            {
                throw new ArgumentException("The collection must not contain null values.", nameof(routes));
            }

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

            var idx = serializedMessage.FrameIndex;

            using (CheckDisposal(ref cancellation, out var disposal))
            {
                try
                {
                    try
                    {
                        EncodeRouteRequest(serializedMessage, routes, publish);

                        var response = await SendInternalAsync(serializedMessage, cancellation);

                        var result = await DecodeRouteResponseAsync(response, cancellation);

                        return(result);
                    }
                    catch
                    {
                        Assert(serializedMessage.FrameIndex >= idx);

                        while (serializedMessage.FrameIndex > idx)
                        {
                            serializedMessage.PopFrame();
                        }

                        throw;
                    }
                }
                catch (OperationCanceledException) when(disposal.IsCancellationRequested)
                {
                    throw new ObjectDisposedException(GetType().FullName);
                }
            }
        }
コード例 #2
0
        private static void EncodeRouteRequest(IMessage message, RouteHierarchy routes, bool publish)
        {
            using (var stream = message.PushFrame().OpenStream())
                using (var writer = new BinaryWriter(stream))
                {
                    writer.Write((short)MessageType.Route);
                    writer.Write((short)0); // Padding
                    writer.Write(routes.Count);

                    for (var i = 0; i < routes.Count; i++)
                    {
                        var routeBytes = Encoding.UTF8.GetBytes(routes[i].ToString());

                        writer.Write(routeBytes.Length);
                        writer.Write(routeBytes);
                    }
                    writer.Write(publish);
                }
        }