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()); }
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>()); }
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); }
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(); }; }
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(); }
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); }
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()); } }
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); }
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); }
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); }
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); }