public override async Task <ReplyEnvelope> Dispatch(RequestEnvelope request, ServerCallContext context)
        {
            var serviceProvider = context.GetHttpContext().RequestServices;
            var serviceRegistry = serviceProvider.GetRequiredService <MessageHandlerRegistry>();
            var logger          = serviceProvider.GetRequiredService <ILogger <DispatcherService> >();

            var sw = Stopwatch.StartNew();

            try
            {
                var requestType    = System.Type.GetType(request.Type, an => Assembly.Load(an.Name ?? null !), null, true, true) ?? null !;
                var messageHandler = serviceRegistry.Resolve(requestType);
                if (messageHandler == null)
                {
                    throw new InvalidOperationException($"Message handler for {requestType} not found");
                }
                var handlerInstance = serviceProvider.GetRequiredService(messageHandler.DeclaringType ?? null !);
                var requestMessage  = JsonSerializer.Deserialize(JsonFormatter.Default.Format(request.Content), requestType) ?? null !;
                var replyMessage    = await messageHandler.InvokeAsync(handlerInstance, new object[] { requestMessage });

                var replyType = replyMessage?.GetType();

                var reply = new ReplyEnvelope
                {
                    CorrelationId = request.CorrelationId,
                    Type          = replyType?.AssemblyQualifiedName ?? string.Empty,
                    Content       = replyMessage == null
                        ? Value.ForNull()
                        : Value.Parser.ParseJson(JsonSerializer.Serialize(replyMessage)),
                    Empty = replyMessage == null
                };

                sw.Stop();
                logger.LogInformation("GRPC Dispatch request {requestId} {requestType} responded {status} with {replyType} in {elapsed} ms", request.CorrelationId, requestType.FullName, "OK", replyType?.FullName, sw.Elapsed.TotalMilliseconds);
                return(reply);
            }
            catch (Exception e)
            {
                var reply = new ReplyEnvelope
                {
                    CorrelationId = request.CorrelationId,
                    Error         = true,
                    ErrorType     = e.GetType().FullName,
                    ErrorMessage  = e.Message,
                    ErrorDetails  = e.ToString()
                };
                sw.Stop();

                logger.LogError(e, "GRPC Dispatch request {requestId} {requestType} responded {status} in {elapsed} ms", request.CorrelationId, request.Type, "ERROR", sw.Elapsed.TotalMilliseconds);

                return(reply);
            }
        }
Example #2
0
        public override async Task <ReplyEnvelope> Dispatch(RequestEnvelope request, ServerCallContext context)
        {
            var serviceProvider = context.GetHttpContext().RequestServices;
            var serviceRegistry = serviceProvider.GetRequiredService <MessageHandlerRegistry>();
            var logger          = serviceProvider.GetRequiredService <ILogger <DispatcherService> >();

            var sw = Stopwatch.StartNew();

            try
            {
                var requestType    = System.Type.GetType(request.Type, an => Assembly.Load(an.Name ?? null !), null, true, true) ?? null !;
                var messageHandler = serviceRegistry.Resolve(requestType);
                if (messageHandler == null)
                {
                    throw new InvalidOperationException($"Message handler for {requestType} not found");
                }
                var handlerInstance = serviceProvider.GetRequiredService(messageHandler.DeclaringType ?? null !);
                using var ms = new MemoryStream(request.Data.ToByteArray());
                var requestMessage = await JsonSerializer.DeserializeAsync(ms, requestType) ?? null !;

                var replyMessage = await messageHandler.InvokeAsync(handlerInstance, new object[] { requestMessage });

                var replyType = replyMessage?.GetType();

                var reply = new ReplyEnvelope
                {
                    CorrelationId = request.CorrelationId,
                    Type          = replyType?.AssemblyQualifiedName ?? string.Empty,
                    Data          = replyMessage == null
                        ? ByteString.Empty
                        : UnsafeByteOperations.UnsafeWrap(JsonSerializer.SerializeToUtf8Bytes(replyMessage)),
                    Empty = replyMessage == null
                };

                sw.Stop();
                logger.LogInformation("GRPC Dispatch request {requestId} {requestType} responded {status} with {replyType} in {elapsed} ms", request.CorrelationId, requestType.FullName, "OK", replyType?.FullName, sw.Elapsed.TotalMilliseconds);
                return(reply);
            }
            catch (Exception e)
            {
                //var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(EssApplicationException));
                //using var ms = new MemoryStream();
                //var writer = XmlDictionaryWriter.CreateTextWriter(ms);
                //serializer.WriteObject(writer, e);

                var reply = new ReplyEnvelope
                {
                    CorrelationId = request.CorrelationId,
                    Error         = true,
                    ErrorType     = e.GetType().AssemblyQualifiedName,
                    ErrorMessage  = e.Message,
                    ErrorDetails  = e.ToString(),
                    //Data = UnsafeByteOperations.UnsafeWrap(ms.ToArray())
                };
                sw.Stop();

                logger.LogError(e, "GRPC Dispatch request {requestId} {requestType} responded {status} in {elapsed} ms", request.CorrelationId, request.Type, "ERROR", sw.Elapsed.TotalMilliseconds);

                return(reply);
            }
        }