/// <summary> /// 获取Action处理的输出字节流 /// </summary> /// <returns></returns> public static byte[] GetActionResponse(int actionId, BaseUser baseUser, string parameters, out HttpGet httpGet) { string serverHost = string.Format("{0}:{1}", ActionConfig.Current.IpAddress, ActionConfig.Current.Port); string param = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}", 0, "st", baseUser.GetSessionId(), baseUser.GetUserId(), actionId, parameters); httpGet = new HttpGet(param, baseUser.SocketSid, baseUser.RemoteAddress); BaseStruct baseStruct = FindRoute(ActionConfig.Current.TypeName, httpGet, actionId); SocketGameResponse response = new SocketGameResponse(); baseStruct.UserFactory = uid => { return baseUser; }; baseStruct.SetPush(); baseStruct.DoInit(); using (baseStruct.RequestLock()) { if (!baseStruct.GetError() && baseStruct.ReadUrlElement() && baseStruct.DoAction() && !baseStruct.GetError()) { baseStruct.BuildPacket(); baseStruct.WriteAction(response); } else { baseStruct.WriteErrorAction(response); } } return response.ReadByte(); }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="param"></param> /// <returns></returns> public byte[] ProcessRequest(object package, object param) { var httpresponse = new SocketGameResponse(); ActionGetter actionGetter = null; try { httpresponse.WriteErrorCallback += new ScutActionDispatcher().ResponseError; RequestPackage p = package as RequestPackage; actionGetter = param as ActionGetter; if (!string.IsNullOrEmpty(p.RouteName)) { if (CheckRemote(p.RouteName, actionGetter)) { MessageStructure response = new MessageStructure(); OnCallRemote(p.RouteName, actionGetter, response); return response.PopBuffer(); } httpresponse.WriteError(actionGetter, 10000, "No permission"); } else { DoAction(actionGetter, httpresponse); } return httpresponse.ReadByte(); } catch (Exception ex) { TraceLog.WriteError("Request error:{0}", ex); MessageStructure response = new MessageStructure(); response.WriteBuffer(new MessageHead(0, 10000, "request error")); return response.PopBuffer(); } }
private void ProcessPackage(object state) { var package = (RequestPackage)state; if (package == null) return; var session = package.Session; try { byte[] data = new byte[0]; if (!string.IsNullOrEmpty(package.RouteName)) { HttpGet httpGet = new HttpGet(package); if (CheckRemote(package.RouteName, httpGet)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.RouteName, httpGet, response); data = response.PopBuffer(); } } else { SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += ActionDispatcher.ResponseError; ActionGetter actionGetter = ActionDispatcher.GetActionGetter(package); OnRequested(actionGetter, response); data = response.ReadByte(); } try { if (data.Length > 0) { session.SendAsync(data, 0, data.Length); } } catch (Exception ex) { TraceLog.WriteError("PostSend异常{0}", ex); } } catch (Exception ex) { TraceLog.WriteError("Task异常{0}", ex); } finally { session.ExitSession(); Interlocked.Decrement(ref runningNum); } }
private void OnHttpRequest(IAsyncResult result) { try { HttpListener listener = (HttpListener)result.AsyncState; HttpListenerContext context = listener.EndGetContext(result); listener.BeginGetContext(OnHttpRequest, listener); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; string sid = request.QueryString["sid"]; GameSession session; if (string.IsNullOrEmpty(sid)) { session = GameSession.CreateNew(Guid.NewGuid(), request); } else { session = GameSession.Get(sid) ?? GameSession.CreateNew(Guid.NewGuid(), request); } string data = ""; if (Environment.OSVersion.Platform == PlatformID.Unix) { if (string.Compare(request.HttpMethod, "get", true) == 0) { data = request.RawUrl.Substring(8); data = HttpUtility.UrlDecode(data); } } else { data = request.QueryString["d"]; } if (string.IsNullOrEmpty(data)) { using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) { data = reader.ReadToEnd(); data = HttpUtility.ParseQueryString(data)["d"]; } } int statuscode = 0; Dictionary<string, string> param = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); if (data != null) { var nvc = HttpUtility.ParseQueryString(data); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } } statuscode = CheckHttpParam(param); if (statuscode != (int)HttpStatusCode.OK) { response.StatusCode = statuscode; response.Close(); return; } var httpresponse = new SocketGameResponse(); httpresponse.WriteErrorCallback += new ActionDispatcher().ResponseError; HttpGet httpGet = new HttpGet(new RequestPackage() { UrlParam = data, Session = session }); httpGet["UserHostAddress"] = session.EndAddress; httpGet["ssid"] = session.KeyCode.ToString("N"); httpGet["http"] = "1"; var clientConnection = new HttpClientConnection { Context = context, Session = session, ActionGetter = httpGet, GameResponse = httpresponse }; clientConnection.TimeoutTimer = new Timer(OnHttpRequestTimeout, clientConnection, httpRequestTimeout, Timeout.Infinite); OnRequested(httpGet, httpresponse); byte[] respData = httpresponse.ReadByte(); OnHttpResponse(clientConnection, respData, 0, respData.Length); } catch (Exception ex) { TraceLog.WriteError("OnHttpRequest error:{0}", ex); } }
private void OnHttpRequest(IAsyncResult result) { try { HttpListener listener = (HttpListener)result.AsyncState; HttpListenerContext context = listener.EndGetContext(result); listener.BeginGetContext(OnHttpRequest, listener); RequestPackage package; if (!ActionDispatcher.TryDecodePackage(context, out package)) { return; } GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? GameSession.CreateNew(package.ProxySid, context.Request); session.ProxySid = package.ProxySid; } else { session = (string.IsNullOrEmpty(package.SessionId) ? GameSession.GetSessionByCookie(context.Request) : GameSession.Get(package.SessionId)) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); } package.Bind(session); ActionGetter httpGet = ActionDispatcher.GetActionGetter(package, session); if (package.IsUrlParam) { httpGet["UserHostAddress"] = session.RemoteAddress; httpGet["ssid"] = session.KeyCode.ToString("N"); httpGet["http"] = "1"; } //set cookie var cookie = context.Request.Cookies["sid"]; if (cookie == null) { cookie = new Cookie("sid", session.SessionId); cookie.Expires = DateTime.Now.AddMinutes(5); context.Response.SetCookie(cookie); } var httpresponse = new SocketGameResponse(); httpresponse.WriteErrorCallback += new ScutActionDispatcher().ResponseError; var clientConnection = new HttpClientConnection { Context = context, Session = session, ActionGetter = httpGet, GameResponse = httpresponse }; var section = GetSection(); clientConnection.TimeoutTimer = new Timer(OnHttpRequestTimeout, clientConnection, section.HttpRequestTimeout, Timeout.Infinite); byte[] respData = new byte[0]; if (!string.IsNullOrEmpty(package.RouteName)) { if (CheckRemote(package.RouteName, httpGet)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.RouteName, httpGet, response); respData = response.PopBuffer(); } } else { DoAction(httpGet, httpresponse); respData = httpresponse.ReadByte(); } OnHttpResponse(clientConnection, respData, 0, respData.Length); } catch (Exception ex) { TraceLog.WriteError("OnHttpRequest error:{0}", ex); } }
private async System.Threading.Tasks.Task ProcessPackage(RequestPackage package, GameSession session) { if (package == null) return; try { ActionGetter actionGetter; byte[] data = new byte[0]; if (!string.IsNullOrEmpty(package.RouteName)) { actionGetter = ActionDispatcher.GetActionGetter(package, session); if (CheckRemote(package.RouteName, actionGetter)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.RouteName, actionGetter, response); data = response.PopBuffer(); } else { return; } } else { SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += ActionDispatcher.ResponseError; actionGetter = ActionDispatcher.GetActionGetter(package, session); DoAction(actionGetter, response); data = response.ReadByte(); } try { if (session != null && data.Length > 0) { await session.SendAsync(actionGetter.OpCode, data, 0, data.Length, OnSendCompleted); } } catch (Exception ex) { TraceLog.WriteError("PostSend error:{0}", ex); } } catch (Exception ex) { TraceLog.WriteError("Task error:{0}", ex); } finally { if (session != null) session.ExitSession(); } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="param"></param> /// <param name="remoteAddress"></param> /// <returns></returns> private byte[] OnRequestComplated(ChannelContext context, string param, string remoteAddress) { lock (context) { SocketGameResponse response = new SocketGameResponse(); HttpGet httpGet = new HttpGet(param, remoteAddress); OnRequested(httpGet, response); return response.ReadByte(); } }
private void ProcessPackage(object state) { var package = (RequestPackage)state; if (package == null) return; var param = package.Param; var session = package.Session; var actionid = package.ActionId; try { if (actionid == (int)ActionEnum.Heartbeat) { // 客户端tcp心跳包 session.LastActivityTime = DateTime.Now; OnHeartbeat(session); session.ExitSession(); Interlocked.Decrement(ref runningNum); return; } HttpGet httpGet = new HttpGet(param, session); byte[] data = new byte[0]; if (!string.IsNullOrEmpty(package.Route)) { if (CheckRemote(package.Route, httpGet)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.Route, httpGet, response); data = response.PopBuffer(); } } else { SocketGameResponse response = new SocketGameResponse(); OnRequested(httpGet, response); data = response.ReadByte(); } try { session.SendAsync(data, 0, data.Length); } catch (Exception ex) { TraceLog.WriteError("PostSend异常{0}", ex); } } catch (Exception ex) { TraceLog.WriteError("Task异常{0}", ex); } finally { session.ExitSession(); Interlocked.Decrement(ref runningNum); } }
private void OnHttpRequestTimeout(object state) { try { HttpClientConnection clientConnection = (HttpClientConnection)state; if (clientConnection == null) return; int actionId = 0; string action; if (clientConnection.Param.TryGetValue("ActionId", out action)) { actionId = action.ToInt(); } var httpresponse = new SocketGameResponse(); ActionFactory.RequestError(httpresponse, actionId, "Request Timeout."); byte[] respData = httpresponse.ReadByte(); OnHttpResponse(clientConnection, respData, 0, respData.Length); } catch { } }