/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="userList"></param> /// <param name="actionId"></param> /// <param name="parameter">Allow Parameters or Custom object as paramter</param> /// <param name="complateHandle"></param> /// <param name="opCode"></param> /// <param name="onlineInterval"></param> public static async System.Threading.Tasks.Task SendAction <T>(List <T> userList, int actionId, object parameter, Action <T, GameSession, SocketAsyncResult> complateHandle, sbyte opCode, int onlineInterval) where T : IUser { foreach (var user in userList) { T temp = user; GameSession session = GameSession.Get(user.GetUserId()); if (session != null) { RequestPackage package = parameter is Parameters ? GetResponsePackage(actionId, session, parameter as Parameters, opCode, null) : GetResponsePackage(actionId, session, null, opCode, parameter); await SendAction(session, actionId, package, (s, result) => { if (complateHandle != null) { complateHandle(temp, session, result); } }, onlineInterval); } else { if (complateHandle != null) { complateHandle(temp, null, new SocketAsyncResult(null) { Result = ResultCode.Close }); } } } }
/// <summary> /// /// </summary> public override void Start(string[] args) { socketListener.StartListen(); if (EnableHttp) { httpListener.Start(); foreach (var prefix in httpListener.Prefixes) { TraceLog.WriteLine("{0} Http service:{1} is started.", DateTime.Now.ToString("HH:mm:ss"), prefix.TrimEnd('/')); } httpListener.BeginGetContext(OnHttpRequest, httpListener); } EntitySyncManger.SendHandle += (userId, data) => { GameSession session = GameSession.Get(userId); if (session != null) { var task = session.SendAsync(OpCode.Binary, data, 0, data.Length, result => { }); task.Wait(); return(task.Result); } return(false); }; TraceLog.WriteLine("{0} Socket service {1}:{2} is started.", DateTime.Now.ToString("HH:mm:ss"), _setting.GameIpAddress, _setting.GamePort); base.Start(args); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="actionId"></param> /// <param name="userList"></param> /// <param name="parameter">Allow Parameters or Custom object as paramter</param> /// <param name="complateHandle"></param> /// <param name="opCode"></param> /// <param name="onlineInterval"></param> /// <returns></returns> public static async System.Threading.Tasks.Task BroadcastAction <T>(int actionId, List <T> userList, object parameter, Action <T, GameSession, SocketAsyncResult> complateHandle, sbyte opCode, int onlineInterval) where T : IUser { List <GameSession> sessionList = new List <GameSession>(); GameSession session; foreach (var user in userList) { session = GameSession.Get(user.GetUserId()); if (session == null) { complateHandle(user, null, new SocketAsyncResult(null) { Result = ResultCode.Close }); } sessionList.Add(session); } if (sessionList.Count == 0) { return; } RequestPackage package = parameter is Parameters ? GetResponsePackage(actionId, sessionList[0], parameter as Parameters, opCode, null) : GetResponsePackage(actionId, sessionList[0], null, opCode, parameter); await BroadcastAction(actionId, sessionList, package, (s, result) => { if (complateHandle != null) { complateHandle((T)s.User, s, result); } }, onlineInterval); }
/// <summary> /// 构造函数 /// </summary> public HttpGet(HttpRequest request) : base(null, null) { _paramString = request["d"] ?? ""; InitData(_paramString); //http string sessionId = ""; if (_param.ContainsKey(ParamSid)) { sessionId = _param[ParamSid]; } if (string.IsNullOrEmpty(sessionId)) { sessionId = request[ParamSid]; } _session = GameSession.Get(sessionId) ?? GameSession.CreateNew(Guid.NewGuid(), request); //set cookie var cookie = request.Cookies.Get(ParamSid); if (cookie == null && HttpContext.Current != null) { cookie = new HttpCookie(ParamSid, SessionId); cookie.Expires = DateTime.Now.AddMinutes(5); HttpContext.Current.Response.Cookies.Add(cookie); } }
private GameSession GetSession(ConnectionEventArgs e, RequestPackage package) { //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? (package.IsProxyRequest ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(package.ProxySid, e.Socket, socketListener)); if (session != null) { session.ProxySid = package.ProxySid; } } else { session = GameSession.Get(package.SessionId) ?? GameSession.Get(e.Socket.HashCode); } if (session == null) { session = GameSession.CreateNew(package.ProxySid, e.Socket, socketListener); } if ((!session.Connected || !Equals(session.RemoteAddress, e.Socket.RemoteEndPoint.ToString()))) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketListener); } session.InitSocket(e.Socket, socketListener); return(session); }
/// <summary> /// 构造函数 /// </summary> public HttpGet(HttpRequest request) { _paramString = request["d"] ?? ""; InitData(_paramString); //http if (_param.ContainsKey("sid")) { SessionId = _param["sid"]; } _session = GameSession.Get(SessionId) ?? GameSession.CreateNew(Guid.NewGuid(), request); }
/// <summary> /// Send async, add 16 len head /// </summary> /// <param name="opCode"></param> /// <param name="data"></param> /// <param name="offset"></param> /// <param name="count"></param> /// <param name="callback"></param> /// <returns></returns> public async System.Threading.Tasks.Task <bool> SendAsync(sbyte opCode, byte[] data, int offset, int count, Action <SocketAsyncResult> callback) { if (!_upAgentGuid.Equals(Guid.Empty)) { var upAgentSession = GameSession.Get(_upAgentGuid); if (upAgentSession != null && customSendHandler != null) { return(await customSendHandler(SessionId, opCode, data, offset, count, callback)); } } return(await PostSend(opCode, data, 0, data.Length, callback)); }
/// <summary> /// 将指定的Action结果广播给指定范围的玩家 /// </summary> /// <typeparam name="T">BaseUser对象</typeparam> /// <param name="actionId">指定的Action</param> /// <param name="userList">指定范围的玩家</param> /// <param name="parameters">请求参数</param> /// <param name="successHandle">成功回调</param> /// <param name="onlineInterval">online interval second</param> public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle, int onlineInterval = 0) where T : IUser { try { if (userList.Count == 0) { return; } StringBuilder shareParam = new StringBuilder(); if (parameters != null) { foreach (var parameter in parameters) { shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value); } } IActionDispatcher actionDispatcher = new ScutActionDispatcher(); ActionGetter actionParam; byte[] sendData = GetActionResponse(actionDispatcher, actionId, userList[0], shareParam.ToString(), out actionParam); foreach (T user in userList) { if (object.Equals(user, null)) { continue; } try { GameSession session = GameSession.Get(user.GetUserId()); if (session != null) { if ((onlineInterval <= 0 || session.LastActivityTime > MathUtils.Now.AddSeconds(-onlineInterval)) && session.SendAsync(actionParam.OpCode, sendData, 0, sendData.Length)) { if (successHandle != null) { successHandle(user); } } } } catch (Exception ex) { TraceLog.WriteError("BroadcastAction action:{0} userId:{1} error:{2}", actionId, user.GetUserId(), ex); } } } catch (Exception ex) { TraceLog.WriteError("BroadcastAction action:{0} error:{1}", actionId, ex); } }
private static GameSession GetSession(System.Web.HttpContext context, RequestPackage package) { GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? GameSession.CreateNew(package.ProxySid, context.Request); session.ProxySid = package.ProxySid; } else { session = GameSession.Get(package.SessionId) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); } return(session); }
public async Task <IHttpResponseAction> Execute(IHttpRequestContext context) { int statusCode; RequestPackage package; var actionDispatcher = GameEnvironment.Setting.ActionDispatcher; if (!actionDispatcher.TryDecodePackage(context.Request, out package, out statusCode)) { return(new ByteResponse(statusCode, statusCode == 200 ? "OK" : "FAIL", new byte[0])); } GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? GameSession.CreateNew(package.ProxySid, context.Request); session.ProxySid = package.ProxySid; } else { session = 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"; } var result = await System.Threading.Tasks.Task.Run <byte[]>(() => { try { return(ScriptEngines.GetCurrentMainScript().ProcessRequest(package, httpGet)); } catch (Exception ex) { TraceLog.WriteError("Excute mainclass error:{0}", ex); return(new byte[0]); } }); return(new ByteResponse(statusCode, "OK", result)); }
/// <summary> /// 获取Action处理的输出字节流 /// </summary> /// <returns></returns> public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, BaseUser baseUser, string urlParam, out ActionGetter actionGetter) { int userId = baseUser != null?baseUser.GetUserId() : 0; GameSession session = GameSession.Get(userId); string sessionId = session != null ? session.SessionId : ""; string param = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}", 0, "st", sessionId, userId, actionId, urlParam); RequestPackage requestPackage = new RequestPackage(0, sessionId, actionId, userId); requestPackage.UrlParam = param; requestPackage.IsUrlParam = true; requestPackage.Session = session; requestPackage.ReceiveTime = DateTime.Now; actionGetter = new HttpGet(requestPackage); BaseStruct baseStruct = FindRoute(GameEnvironment.Setting.ActionTypeName, actionGetter, actionId); SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += actionDispatcher.ResponseError; baseStruct.UserFactory = uid => { return(baseUser); }; baseStruct.SetPush(); baseStruct.DoInit(); using (ILocking locking = baseStruct.RequestLock()) { if (locking.IsLocked) { if (!baseStruct.GetError() && baseStruct.ReadUrlElement() && baseStruct.DoAction() && !baseStruct.GetError()) { baseStruct.WriteResponse(response); } else { baseStruct.WriteErrorAction(response); } } } return(response.ReadByte()); }
private void OnDisconnected(ISocket sender, ConnectionEventArgs e) { try { GameSession session = GameSession.Get(e.Socket.HashCode); if (session != null) { OnDisconnected(session); session.ProxySid = Guid.Empty; session.Close(); } } catch (Exception err) { TraceLog.WriteError("Disconnected error:{0}", err); } }
/// <summary> /// 构造函数 /// </summary> public HttpGet(HttpRequest request) : base(null, null) { _paramString = request["d"] ?? ""; InitData(_paramString); //http string sessionId = ""; if (_param.ContainsKey("sid")) { sessionId = _param["sid"]; } if (string.IsNullOrEmpty(sessionId)) { sessionId = request["sid"]; } _session = GameSession.Get(sessionId) ?? GameSession.CreateNew(Guid.NewGuid(), request); }
/// <summary> /// /// </summary> public override void Start(string[] args) { socketLintener.StartListen(); if (EnableHttp) { httpListener.Start(); httpListener.BeginGetContext(OnHttpRequest, httpListener); } EntitySyncManger.SendHandle += (userId, data) => { GameSession session = GameSession.Get(userId); if (session != null) { return(session.SendAsync(data, 0, data.Length)); } return(false); }; OnStartAffer(); }
private static GameSession GetSession(System.Web.HttpContext context, RequestPackage package) { 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); } session.InitHttp(context.Request); return(session); }
/// <summary> /// 获取Action处理的输出字节流 /// </summary> /// <returns></returns> public static byte[] GetActionResponse(int actionId, BaseUser baseUser, string parameters, out HttpGet httpGet) { int userId = baseUser != null?baseUser.GetUserId() : 0; GameSession session = GameSession.Get(userId); string sessionId = session != null ? session.SessionId : ""; string param = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}", 0, "st", sessionId, userId, actionId, parameters); httpGet = new HttpGet(param, session); BaseStruct baseStruct = FindRoute(GameEnvironment.Setting.ActionTypeName, httpGet, actionId); SocketGameResponse response = new SocketGameResponse(); baseStruct.UserFactory = uid => { return(baseUser); }; baseStruct.SetPush(); baseStruct.DoInit(); using (ILocking locking = baseStruct.RequestLock()) { if (locking.IsLocked) { if (!baseStruct.GetError() && baseStruct.ReadUrlElement() && baseStruct.DoAction() && !baseStruct.GetError()) { baseStruct.BuildPacket(); baseStruct.WriteAction(response); } else { baseStruct.WriteErrorAction(response); } } } return(response.ReadByte()); }
/// <summary> /// 将指定的Action结果广播给指定范围的玩家 /// </summary> /// <typeparam name="T">BaseUser对象</typeparam> /// <param name="actionId">指定的Action</param> /// <param name="userList">指定范围的玩家</param> /// <param name="parameters">请求参数</param> /// <param name="successHandle">成功回调</param> public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle) where T : IUser { StringBuilder shareParam = new StringBuilder(); if (parameters != null) { foreach (var parameter in parameters) { shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value); } } IActionDispatcher actionDispatcher = new ScutActionDispatcher(); ActionGetter actionParam; byte[] sendData = GetActionResponse(actionDispatcher, actionId, null, shareParam.ToString(), out actionParam); foreach (T user in userList) { if (object.Equals(user, null)) { continue; } try { GameSession session = GameSession.Get(user.GetUserId()); if (session != null) { if (session.SendAsync(sendData, 0, sendData.Length)) { if (successHandle != null) { successHandle(user); } } } } catch (Exception ex) { TraceLog.WriteError("BroadcastAction action:{0} userId:{1} error:{2}", actionId, user.GetUserId(), ex); } } }
/// <summary> /// /// </summary> public override void Start(string[] args) { socketListener.StartListen(); if (EnableHttp) { httpListener.Start(); httpListener.BeginGetContext(OnHttpRequest, httpListener); } EntitySyncManger.SendHandle += (userId, data) => { GameSession session = GameSession.Get(userId); if (session != null) { var task = session.SendAsync(OpCode.Binary, data, 0, data.Length, result => { }); task.Wait(); return(task.Result); } return(false); }; base.Start(args); }
/// <summary> /// 获取Action处理的输出字节流 /// </summary> /// <param name="actionDispatcher"></param> /// <param name="actionId"></param> /// <param name="baseUser"></param> /// <param name="urlParam"></param> /// <param name="actionGetter"></param> /// <returns></returns> public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, IUser baseUser, string urlParam, out ActionGetter actionGetter) { int userId = baseUser != null?baseUser.GetUserId() : 0; GameSession session = GameSession.Get(userId); string sessionId = session != null ? session.SessionId : ""; string param = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}", 0, "st", sessionId, userId, actionId, urlParam); RequestPackage requestPackage = new RequestPackage(0, sessionId, actionId, userId); requestPackage.UrlParam = param; requestPackage.IsUrlParam = true; requestPackage.Bind(session); actionGetter = new HttpGet(requestPackage); return(GetActionResponse(actionDispatcher, actionId, baseUser, actionGetter)); }
/// <summary> /// 将指定的Action结果广播给指定范围的玩家 /// </summary> /// <typeparam name="T">BaseUser对象</typeparam> /// <param name="actionId">指定的Action</param> /// <param name="userList">指定范围的玩家</param> /// <param name="parameters">请求参数</param> /// <param name="successHandle">成功回调</param> public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle) where T : BaseUser { StringBuilder shareParam = new StringBuilder(); if (parameters != null) { foreach (var parameter in parameters) { shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value); } } HttpGet httpGet; byte[] sendData = GetActionResponse(actionId, null, shareParam.ToString(), out httpGet); foreach (var user in userList) { if (user == default(T)) { continue; } try { GameSession session = GameSession.Get(user.GetUserId()); if (session != null) { if (session.SendAsync(sendData, 0, sendData.Length)) { if (successHandle != null) { successHandle(user); } } } } catch (Exception ex) { TraceLog.WriteError("BroadcastAction action:{0} userId:{1} error:{2}", actionId, user.PersonalId, ex); } } }
/// <summary> /// 给指定范围的每个玩家发送指定的Action结果 /// </summary> /// <typeparam name="T">BaseUser对象</typeparam> /// <param name="userList">指定范围的玩家</param> /// <param name="actionId">指定的Action</param> /// <param name="parameters">请求参数</param> /// <param name="successHandle">成功回调</param> public static void SendAsyncAction <T>(List <T> userList, int actionId, Parameters parameters, Action <ActionGetter> successHandle) where T : BaseUser { StringBuilder shareParam = new StringBuilder(); if (parameters != null) { foreach (var parameter in parameters) { shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value); } } IActionDispatcher actionDispatcher = new ActionDispatcher(); foreach (var user in userList) { if (user == default(T)) { continue; } try { var session = GameSession.Get(user.GetUserId()); ActionGetter actionParam; byte[] sendData = GetActionResponse(actionDispatcher, actionId, user, shareParam.ToString(), out actionParam); if (session != null && session.SendAsync(sendData, 0, sendData.Length) && actionParam != null) { successHandle(actionParam); } } catch (Exception ex) { TraceLog.WriteError("SendToClient action:{0} userId:{1} error:{2}", actionId, user.PersonalId, 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 = GameSession.Get(package.SessionId) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); } package.Bind(session); ActionGetter httpGet = ActionDispatcher.GetActionGetter(package); if (package.IsUrlParam) { httpGet["UserHostAddress"] = session.EndAddress; httpGet["ssid"] = session.KeyCode.ToString("N"); httpGet["http"] = "1"; } var httpresponse = new SocketGameResponse(); httpresponse.WriteErrorCallback += new ScutActionDispatcher().ResponseError; var clientConnection = new HttpClientConnection { Context = context, Session = session, ActionGetter = httpGet, GameResponse = httpresponse }; clientConnection.TimeoutTimer = new Timer(OnHttpRequestTimeout, clientConnection, 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 void socketLintener_DataReceived(object sender, ConnectionEventArgs e) { try { Interlocked.Increment(ref receiveNum); OnReceivedBefore(e); //if (isInStopping) return; Dictionary <string, string> param = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); string paramStr = Encoding.ASCII.GetString(e.Data); int index = paramStr.IndexOf("?d="); string routeName = string.Empty; if (index != -1) { if (paramStr.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { routeName = paramStr.Substring(6, index - 6); } paramStr = paramStr.Substring(index, paramStr.Length - index); paramStr = HttpUtility.ParseQueryString(paramStr)["d"]; } var nvc = HttpUtility.ParseQueryString(paramStr); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } if (param.ContainsKey("route")) { routeName = param["route"]; } //if (!param.ContainsKey("ssid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("actionid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("msgid")) { Interlocked.Increment(ref errorDropNum); return; } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { Interlocked.Increment(ref errorDropNum); return; } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { Interlocked.Increment(ref errorDropNum); return; } bool isproxy = param.ContainsKey("isproxy");//proxy server send string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (proxySid != Guid.Empty) { session = GameSession.Get(proxySid) ?? (isproxy ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(proxySid, e.Socket, socketLintener.PostSend)); session.ProxySid = proxySid; } else { session = GameSession.Get(e.Socket.HashCode); } if (session != null && !session.Connected) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketLintener.PostSend); } if (actionid == (int)ActionEnum.Interrupt) { //Proxy server notifly interrupt connect ops OnDisconnected(session); if (session != null && (session.ProxySid == Guid.Empty || GameSession.Count > 1)) { //保留代理服连接 session.Close(); session.ProxySid = Guid.Empty; } return; } requestQueue.Enqueue(new RequestPackage { Route = routeName, ActionId = actionid, Param = paramStr, Session = session, ReceiveTime = DateTime.Now }); singal.Set(); } catch (Exception ex) { TraceLog.WriteError("Received to Host:{0} error:{1}", e.Socket.RemoteEndPoint, ex); } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task <IHttpResponseAction> Execute(IHttpRequestContext context) { int statusCode; RequestPackage package; var actionDispatcher = GameEnvironment.Setting.ActionDispatcher; if (!actionDispatcher.TryDecodePackage(context.Request, out package, out statusCode)) { return(new ByteResponse(statusCode, statusCode == 200 ? "OK" : "FAIL", new byte[0])); } 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); } session.InitHttp(context.Request); session.RemoteAddress = context.UserHostAddress; 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"; } var result = await System.Threading.Tasks.Task.Run <byte[]>(() => { try { return(ScriptEngines.GetCurrentMainScript().ProcessRequest(package, httpGet)); } catch (Exception ex) { TraceLog.WriteError("Excute mainclass error:{0}", ex); return(new byte[0]); } }); string sessionId = session.SessionId; var response = new ByteResponse(statusCode, "OK", result, session.UserId.ToString()) { RequestParams = package.OriginalParam }; response.CookieHandle += ctx => { var cookie = ctx.Request.Cookies["sid"]; if (cookie == null) { cookie = new Cookie("sid", sessionId); cookie.Expires = DateTime.Now.AddMinutes(5); ctx.Response.SetCookie(cookie); } }; return(response); }
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); } }