public async Task <HttpResponseMessage> Actor(string id, ActorRequest request)
        {
            // Get Message

            IInterfacedPayload message;

            try
            {
                var jsonText = await Request.Content.ReadAsStringAsync();

                var json = JObject.Parse(jsonText);

                var type = TypeUtility.GetType(request.MessageType);
                if (type == null)
                {
                    return(Request.CreateResponse(
                               HttpStatusCode.BadRequest,
                               "Cannot find message type: " + request.MessageType));
                }

                message = (IInterfacedPayload)Activator.CreateInstance(type);
                JsonConvert.PopulateObject(request.MessageData.ToString(), message);

                Console.WriteLine("* Actor({0}) <- {1} {2}", id, type.Name, request.MessageData.ToString(Formatting.None));
            }
            catch (Exception e)
            {
                return(Request.CreateResponse(
                           HttpStatusCode.BadRequest,
                           e.ToString()));
            }

            // Try to send message to actor

            IActorRef actor;

            try
            {
                actor = await Program.System.ActorSelection("/user/" + id).ResolveOne(TimeSpan.Zero);
            }
            catch (Exception e)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound, "Actor not found: " + e));
            }

            if (request.RequestId != 0)
            {
                var reply = await actor.Ask <ResponseMessage>(new RequestMessage
                {
                    RequestId     = request.RequestId,
                    InvokePayload = message
                });

                if (reply != null)
                {
                    var reply2 = new ActorReply {
                        RequestId = reply.RequestId
                    };
                    if (reply.Exception != null)
                    {
                        reply2.Exception = reply.Exception;
                        Console.WriteLine("* Actor({0}) -> {1}", id, reply.Exception);
                    }
                    else if (reply.ReturnPayload != null)
                    {
                        reply2.ResultType = reply.ReturnPayload.GetType().FullName;
                        var value = reply.ReturnPayload.Value;
                        if (value != null)
                        {
                            reply2.ResultData = JToken.FromObject(value);
                            Console.WriteLine("* Actor({0}) -> {1} {2}", id, reply.ReturnPayload.GetType().Name, reply2.ResultData.ToString(Formatting.None));
                        }
                        else
                        {
                            Console.WriteLine("* Actor({0}) -> null", id);
                        }
                    }
                    else
                    {
                        Console.WriteLine("* Actor({0}) -> void", id);
                    }
                    return(Request.CreateResponse(HttpStatusCode.OK, reply2));
                }
                else
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "?"));
                }
            }
            else
            {
                actor.Tell(new RequestMessage {
                    InvokePayload = message
                });
                return(Request.CreateResponse(HttpStatusCode.OK));
            }
        }
Пример #2
0
        public async Task<HttpResponseMessage> Actor(string id, ActorRequest request)
        {
            // Get Message

            IInterfacedPayload message;
            try
            {
                var jsonText = await Request.Content.ReadAsStringAsync();
                var json = JObject.Parse(jsonText);

                var type = TypeUtility.GetType(request.MessageType);
                if (type == null)
                {
                    return Request.CreateResponse(
                        HttpStatusCode.BadRequest,
                        "Cannot find message type: " + request.MessageType);
                }

                message = (IInterfacedPayload)Activator.CreateInstance(type);
                JsonConvert.PopulateObject(request.MessageData.ToString(), message);

                Console.WriteLine("* Actor({0}) <- {1} {2}", id, type.Name, request.MessageData.ToString(Formatting.None));
            }
            catch (Exception e)
            {
                return Request.CreateResponse(
                    HttpStatusCode.BadRequest,
                    e.ToString());
            }

            // Try to send message to actor

            IActorRef actor;
            try
            {
                actor = await Program.System.ActorSelection("/user/" + id).ResolveOne(TimeSpan.Zero);
            }
            catch (Exception e)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound, "Actor not found: " + e);
            }

            if (request.RequestId != 0)
            {
                var reply = await actor.Ask<ResponseMessage>(new RequestMessage
                {
                    RequestId = request.RequestId,
                    InvokePayload = message
                });
                if (reply != null)
                {
                    var reply2 = new ActorReply { RequestId = reply.RequestId };
                    if (reply.Exception != null)
                    {
                        reply2.Exception = reply.Exception;
                        Console.WriteLine("* Actor({0}) -> {1}", id, reply.Exception);
                    }
                    else if (reply.ReturnPayload != null)
                    {
                        reply2.ResultType = reply.ReturnPayload.GetType().FullName;
                        var value = reply.ReturnPayload.Value;
                        if (value != null)
                        {
                            reply2.ResultData = JToken.FromObject(value);
                            Console.WriteLine("* Actor({0}) -> {1} {2}", id, reply.ReturnPayload.GetType().Name, reply2.ResultData.ToString(Formatting.None));
                        }
                        else
                        {
                            Console.WriteLine("* Actor({0}) -> null", id);
                        }
                    }
                    else
                    {
                        Console.WriteLine("* Actor({0}) -> void", id);
                    }
                    return Request.CreateResponse(HttpStatusCode.OK, reply2);
                }
                else
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest, "?");
                }
            }
            else
            {
                actor.Tell(new RequestMessage { InvokePayload = message });
                return Request.CreateResponse(HttpStatusCode.OK);
            }
        }