/// <summary> /// 获取Action处理的输出字节流 /// </summary> /// <returns></returns> public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, IUser baseUser, ActionGetter actionGetter) { BaseStruct baseStruct = FindRoute(GameEnvironment.Setting.ActionTypeName, actionGetter, actionId); SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += actionDispatcher.ResponseError; baseStruct.SetPush(); baseStruct.DoInit(); using (ILocking locking = baseStruct.RequestLock()) { if (locking == null || locking.IsLocked) { if (!baseStruct.GetError() && baseStruct.ReadUrlElement() && baseStruct.DoAction() && !baseStruct.GetError()) { baseStruct.WriteResponse(response); } else { baseStruct.WriteErrorAction(response); } } } return(response.ReadByte()); }
/// <summary> /// /// </summary> /// <returns></returns> public ILocking RequestLock() { ILocking strategy = null; strategy = Current.MonitorLock.Lock(); if (strategy == null || !strategy.TryEnterLock()) { ErrorCode = Language.Instance.ErrorCode; if (!IsRealse) { ErrorInfo = Language.Instance.ServerBusy; } TraceLog.WriteError("Action-{0} Uid:{1} locked timeout.", actionId, UserId); } return(strategy); }
/// <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()); }
/// <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> /// /// </summary> /// <param name="baseStruct"></param> /// <param name="actionGetter"></param> /// <param name="response"></param> public static void Process(BaseStruct baseStruct, ActionGetter actionGetter, BaseGameResponse response) { baseStruct.DoInit(); using (ILocking locking = baseStruct.RequestLock()) { if (locking == null || locking.IsLocked) { if (!baseStruct.GetError() && baseStruct.ReadUrlElement() && baseStruct.DoAction() && !baseStruct.GetError()) { baseStruct.WriteResponse(response); } else { baseStruct.WriteErrorAction(response); } } } }
/// <summary> /// /// </summary> /// <param name="baseStruct"></param> /// <param name="httpGet"></param> /// <param name="response"></param> /// <param name="userFactory"></param> public static void Process(BaseStruct baseStruct, HttpGet httpGet, IGameResponse response, Func <int, BaseUser> userFactory) { baseStruct.UserFactory = userFactory; 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); } } } }
/// <summary> /// /// </summary> /// <returns></returns> public ILocking RequestLock() { ILocking strategy = null; if (Current != null) { var tempLock = Current.MonitorLock.Lock(); if (tempLock != null && tempLock.TryEnterLock()) { strategy = tempLock; } else { ErrorCode = LanguageHelper.GetLang().ErrorCode; if (!IsRealse) { ErrorInfo = LanguageHelper.GetLang().ServerBusy; } TraceLog.WriteError("Action-{0} Uid:{1} locked timeout.", actionId, UserId); } } return(strategy); }