Exemplo n.º 1
0
        async Task OnRequest(HttpContext context)
        {
            var request  = context.Request;
            var response = context.Response;

            response.Headers.Add("Access-Control-Allow-Origin", "*");
            var path       = request.Path.Value;
            var arry       = path.Split('/');
            var service    = arry[2];
            var method     = arry[3];
            var token      = request.Headers["token"];
            var requestMsg = new RequestJsonMessage()
            {
                Service = service,
                Method  = method,
                Token   = token,
            };

            if (request.ContentLength > 0)
            {
                var reader = new StreamReader(request.Body);
                var args   = await reader.ReadToEndAsync();

                requestMsg.Args = args.ToObject <List <object> >();
            }
            //var instance = ServerCreater.Instance;
            var server = _serverCreater.GetServer();
            var result = server.InvokeResult(requestMsg, type =>
            {
                //获取注入的AbsService
                return(_serviceProvider.GetService(type));
            });
            await response.WriteAsync(result.ToJson());
        }
Exemplo n.º 2
0
        ResponseJsonMessage SendRequest(ParameterInfo[] argsName, RequestJsonMessage msg)
        {
            var    hostAddress = HostAddress;
            string url;

            if (!string.IsNullOrEmpty(hostAddress.serviceNamePrefix))
            {
                url = hostAddress.GetHttpAddress() + $"/{msg.Service}/{msg.Method}";
            }
            else
            {
                url = hostAddress.GetHttpAddress() + $"/DynamicApi/{msg.Service}/{msg.Method}";
            }

            var request = new ImitateWebRequest(HostAddress.address, Encoding.UTF8);

            request.ContentType = "application/json";
            //var token = clientConnect.Token;
            var token = CreateAccessToken(argsName, msg.Args, clientConnect.TokenInfo);

            request.SetHead("token", token);
            var json   = msg.Args.ToJson();
            var result = request.Post(url, json);

            return(result.ToObject <ResponseJsonMessage>());
        }
Exemplo n.º 3
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var controlName = ServiceName;
            var method      = serviceInfo.GetMethod(binder.Name);
            //var methodAttribute = method.GetAttribute<MethodAttribute>();
            //var methodParamters = method.MethodInfo.GetParameters();
            var returnType = method.MethodInfo.ReturnType;
            var request    = new RequestJsonMessage
            {
                Service = controlName,
                Method  = binder.Name,
                Token   = clientConnect.TokenInfo.Token
            };

            request.Args = args.ToList();
            object response = null;

            response = SendRequest(serviceInfo, method, args);
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            result = response;

            return(true);
        }
Exemplo n.º 4
0
        public void Init(HttpApplication context)
        {
            context.BeginRequest += (s, e) =>
            {
                var application = s as HttpApplication;
                var request     = application.Request;
                var response    = application.Response;
                var path        = request.FilePath;
                if (!path.StartsWith("/DynamicApi/"))
                {
                    return;
                }
                var arry    = path.Split('/');
                var service = arry[2];
                var method  = arry[3];
                //var serviceHandle = ApiServer.serviceHandle;
                var token = request.Headers["token"];
                //var apiServer = ApiServer.Instance;

                var requestMsg = new RequestJsonMessage()
                {
                    Service = service,
                    Method  = method,
                    Token   = token,
                };
                if (request.Files != null && request.Files.Count > 0)
                {
                    var file = request.Files[0];
                    //requestMsg.httpPostedFile = file;
                }
                if (request.ContentLength > 0)
                {
                    var ms   = request.InputStream;
                    var data = new byte[request.ContentLength];
                    ms.Read(data, 0, data.Length);
                    var args = System.Text.Encoding.UTF8.GetString(data);
                    requestMsg.Args = args.ToObject <List <object> >();
                }
                var result = apiServer.InvokeResult(requestMsg, null);
                response.Headers.Add("Access-Control-Allow-Origin", "*");
                response.ContentType = "application/json";
                response.Write(result.ToJson());
                response.End();
            };
        }
Exemplo n.º 5
0
        void OnRequest(HttpListenerContext context)
        {
            var request  = context.Request;
            var response = context.Response;

            response.Headers.Add("Access-Control-Allow-Origin", "*");
            var path   = request.Url.AbsolutePath;
            var prefix = path.Split('/')[1];

            if (!serviceInfo.apiPrefixCache.ContainsKey(prefix))
            {
                byte[] res2 = Encoding.UTF8.GetBytes(path);
                response.OutputStream.Write(res2, 0, res2.Length);
                response.Close();
                return;
            }
            var arry    = path.Split('/');
            var service = arry[2];
            var method  = arry[3];
            //var serviceHandle = ApiServer.serviceHandle;
            var token = request.Headers["token"];

            var requestMsg = new RequestJsonMessage()
            {
                Service   = service,
                Method    = method,
                Token     = token,
                ApiPrefix = prefix
            };

            if (request.ContentLength64 > 0)
            {
                var ms   = request.InputStream;
                var data = new byte[request.ContentLength64];
                ms.Read(data, 0, data.Length);
                var args = System.Text.Encoding.UTF8.GetString(data);
                requestMsg.Args = args.ToObject <List <object> >();
            }
            var result = ServerCreater.Instance.GetServer().InvokeResult(requestMsg);

            byte[] res = Encoding.UTF8.GetBytes(result.ToJson());
            response.OutputStream.Write(res, 0, res.Length);
            response.Close();
        }
Exemplo n.º 6
0
        internal ResponseJsonMessage SendRequest(RequestJsonMessage msg)
        {
            var id = Guid.NewGuid().ToString();

            allWaits.Add(id);
            msg.MsgId = id;
            WebSocketFrame frame = new TextWebSocketFrame(msg.ToBuffer());

            if (!channel.Active)
            {
                //ThrowError("服务端已断开连接", "500");
            }
            channel.WriteAndFlushAsync(frame);

            //等待返回
            var response = allWaits.Wait(id).Response;

            return(response);
        }
Exemplo n.º 7
0
        void HandleWebSocketFrame(IChannelHandlerContext ctx, WebSocketFrame frame)
        {
            // Check for closing frame
            if (frame is CloseWebSocketFrame)
            {
                this.handshaker.CloseAsync(ctx.Channel, (CloseWebSocketFrame)frame.Retain());
                server.RemoveClient(ctx);
                return;
            }

            if (frame is PingWebSocketFrame)
            {
                //ctx.WriteAsync(new PongWebSocketFrame((IByteBuffer)frame.Content.Retain()));
                //Console.WriteLine("PingWebSocketFrame");
                //server.AddClient(ctx);
                return;
            }

            if (frame is TextWebSocketFrame)
            {
                var data = ((TextWebSocketFrame)frame).Text();
                //Console.WriteLine("收到消息:" + data);
                var request = RequestJsonMessage.FromBuffer(data);
                // Echo the frame
                var result = server.InvokeResult2(ctx, request) as ResponseJsonMessage;
                if (result == null)
                {
                    return;
                }
                result.MsgId = request.MsgId;
                var frame2 = new TextWebSocketFrame(result.ToBuffer());
                ctx.WriteAsync(frame2);
                //Console.WriteLine("发送回复");
                return;
            }

            if (frame is BinaryWebSocketFrame)
            {
                // Echo the frame
                ctx.WriteAsync(frame.Retain());
            }
        }
Exemplo n.º 8
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var controlName = ServiceName;
            var method      = serviceInfo.GetMethod(binder.Name);
            //var methodAttribute = method.GetAttribute<MethodAttribute>();
            //var methodParamters = method.MethodInfo.GetParameters();
            var returnType = method.MethodInfo.ReturnType;
            var request    = new RequestJsonMessage
            {
                Service = controlName,
                Method  = binder.Name,
                Token   = clientConnect.TokenInfo.Token
            };

            request.Args = args.ToList();
            object response = null;

            try
            {
                response = SendRequest(serviceInfo, method, args);
            }
            catch (Exception ero)
            {
                var msg = ero.Message;
                if (ero is RequestException)
                {
                    msg = (ero as RequestException).ToString();
                }
                ThrowError(msg, "500");
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            result = response;

            return(true);
        }
Exemplo n.º 9
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var methodInfo = serviceInfo.GetMethod(binder.Name);
            var id         = Guid.NewGuid().ToString();
            var method     = ServiceType.GetMethod(binder.Name);
            var returnType = method.ReturnType;
            var request    = new RequestJsonMessage
            {
                Service = ServiceName,
                Method  = binder.Name,
                //Token = clientConnect.Token
            };
            var allArgs = method.GetParameters();
            var token   = request.Token;

            request.Token = CreateAccessToken(allArgs, args.ToList(), clientConnect.TokenInfo);
            request.Args  = args.ToList();
            ResponseJsonMessage response = null;

            try
            {
                response = ((WebSocketClientConnect)clientConnect).SendRequest(request);
            }
            catch (Exception ero)
            {
                ThrowError(ero.Message, "500");
            }
            if (response == null)
            {
                ThrowError("请求超时未响应", "500");
            }
            if (!response.Success)
            {
                ThrowError($"服务端处理错误:{response.Msg}", response.Data);
            }
            if (response.Outs != null && response.Outs.Count > 0)
            {
                foreach (var kv in response.Outs)
                {
                    var p     = allArgs[kv.Key];
                    var value = kv.Value;
                    if (p.Name.EndsWith("&"))
                    {
                        var name  = p.Name.Replace("&", "");
                        var type2 = Type.GetType(name);
                        value = value.ToString().ToObject(type2);
                    }
                    args[kv.Key] = value;
                }
            }
            if (!string.IsNullOrEmpty(response.Token))
            {
                clientConnect.TokenInfo.Token = response.Token;
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            var generType = returnType;

            if (methodInfo.IsAsync)
            {
                generType = returnType.GenericTypeArguments[0];
            }
            result = response.GetData(generType);
            if (methodInfo.IsAsync)
            {
                var result2 = result;
                var task    = methodInfo.TaskCreater();
                task.ResultCreater = async() =>
                {
                    return(await Task.FromResult(result2));
                };
                result = task.InvokeAsync();
            }
            return(true);
        }
Exemplo n.º 10
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var methodInfo      = serviceInfo.GetMethod(binder.Name);
            var id              = Guid.NewGuid().ToString();
            var method          = ServiceType.GetMethod(binder.Name);
            var methodParamters = method.GetParameters();
            var returnType      = method.ReturnType;
            var request         = new RequestJsonMessage
            {
                Service = ServiceName,
                Method  = binder.Name,
            };
            var allArgs = method.GetParameters();

            request.Args = args.ToList();
            var pollyAttr = serviceInfo.GetAttribute <PollyAttribute>();

            //ResponseJsonMessage response = null;
            #region send
            var    hostAddress = HostAddress;
            string url;
            if (!string.IsNullOrEmpty(hostAddress.serviceNamePrefix))
            {
                //使用网关
                url = hostAddress.GetHttpAddress() + $"/{request.Service}/{request.Method}";
            }
            else
            {
                url = hostAddress.GetHttpAddress() + $"/{serviceInfo.ServiceAttribute.ApiPrefix}/{request.Service}/{request.Method}";
            }

            var httpRequest = new ImitateWebRequest(HostAddress.address, Encoding.UTF8);
            httpRequest.ContentType = "application/json";
            var token = CreateAccessToken(methodParamters, request.Args, clientConnect.TokenInfo);
            httpRequest.SetHead("token", token);

            #endregion
            var json = request.Args.ToJson();
            Func <string, object> dataCall = (msg) =>
            {
                var resMsg = msg.ToObject <ResponseJsonMessage>();
                if (!resMsg.Success)
                {
                    ThrowError($"服务端处理错误:{resMsg.Msg}", resMsg.Data);
                }
                if (resMsg.Outs != null && resMsg.Outs.Count > 0)
                {
                    foreach (var kv in resMsg.Outs)
                    {
                        var p     = allArgs[kv.Key];
                        var value = kv.Value;
                        if (p.Name.EndsWith("&"))
                        {
                            var name  = p.Name.Replace("&", "");
                            var type2 = Type.GetType(name);
                            value = value.ToString().ToObject(type2);
                        }
                        args[kv.Key] = value;
                    }
                }
                if (!string.IsNullOrEmpty(resMsg.Token))
                {
                    clientConnect.TokenInfo.Token = resMsg.Token;
                }
                var generType = returnType;
                if (methodInfo.IsAsync)
                {
                    generType = returnType.GenericTypeArguments[0];
                }
                //转换为实际的数据类型
                return(resMsg.GetData(generType));
            };

            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            if (methodInfo.IsAsync)
            {
                var asynResult = SendRequestAsync(pollyAttr, httpRequest, url, "POST", json, $"{ServiceName}.{method.Name}", dataCall);
                var task       = methodInfo.TaskCreater();
                task.ResultCreater = async() =>
                {
                    return(await asynResult);
                };
                result = task.InvokeAsync();
            }
            else
            {
                result = SendRequest(pollyAttr, httpRequest, url, "POST", json, $"{ServiceName}.{method.Name}", dataCall);
            }

            return(true);
        }
Exemplo n.º 11
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var id              = Guid.NewGuid().ToString();
            var method          = ServiceType.GetMethod(binder.Name);
            var methodParamters = method.GetParameters();
            var returnType      = method.ReturnType;
            var request         = new RequestJsonMessage
            {
                Service = ServiceName,
                Method  = binder.Name,
                //Token = clientConnect.Token.Token
            };
            var allArgs = method.GetParameters();

            request.Args = args.ToList();
            ResponseJsonMessage response = null;

            try
            {
                response = SendRequest(methodParamters, request);
            }
            catch (Exception ero)
            {
                ThrowError(ero.Message, "500");
            }
            if (response == null)
            {
                ThrowError("请求超时未响应", "500");
            }
            if (!response.Success)
            {
                ThrowError($"服务端处理错误:{response.Msg}", response.Data);
            }
            if (response.Outs != null && response.Outs.Count > 0)
            {
                foreach (var kv in response.Outs)
                {
                    var p     = allArgs[kv.Key];
                    var value = kv.Value;
                    if (p.Name.EndsWith("&"))
                    {
                        var name  = p.Name.Replace("&", "");
                        var type2 = Type.GetType(name);
                        value = value.ToString().ToObject(type2);
                    }
                    args[kv.Key] = value;
                }
            }
            if (!string.IsNullOrEmpty(response.Token))
            {
                clientConnect.TokenInfo.Token = response.Token;
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            result = response.GetData(returnType);

            return(true);
        }