Пример #1
0
        /// <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());
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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());
        }
Пример #4
0
        /// <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());
        }
Пример #5
0
 /// <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);
             }
         }
     }
 }
Пример #6
0
 /// <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);
             }
         }
     }
 }
Пример #7
0
        /// <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);
        }