Exemple #1
0
        /// <summary>寫入重發標記</summary>
        /// <param name="client">目標客戶端</param>
        /// <param name="methodName">方法名</param>
        /// <returns>"cmdCode:確認碼"</returns>
        private string RecordMethodQueue(ClientInfo client, string methodName, List <object> methodArgs)
        {
            ShelvedMethod sm = null;

            if (client.MethodQueue.Any(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any()))
            {
                sm        = client.MethodQueue.First(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any());
                sm.ExecAt = DateTime.Now;
            }
            else
            {
                // 原理 所有 RecordMethodQueue 目標客戶端都會將方法名在 ClientInfo 中加入為 ShelvedMethod 收到的客戶端會將確認碼(CmdCode)回傳回來,伺服器在得到確認碼之後才把對應的 ShelvedMethod
                // 清掉 重發的時機則是在 OnReconnect 或 OnConnect 觸發時,跑一輪該客戶端所有的 ShelvedMethod
                sm = new ShelvedMethod
                {
                    Name       = methodName,
                    MethodArgs = methodArgs,
                    ExecAt     = DateTime.Now,
                    CmdCode    = Guid.NewGuid().ToString()
                };

                client.MethodQueue.Add(sm);
            }

            // 這邊的 "cmdCode:" 是因為出去的 JSON 格式在客戶端只有讀出值而不是 KeyValPair 這類的 所以先這樣做,還沒想到比較好的辦法
            return("cmdCode:" + sm.CmdCode);
        }
Exemple #2
0
        /// <summary>寫入重發佇列</summary>
        /// <param name="methodName">方法名</param>
        /// <param name="methodArgs">參數</param>
        /// <param name="serverSideMethodName">伺服端方法名稱(客戶端重發用)</param>
        /// <returns>確認碼</returns>
        public string RecordMethodQueue(string methodName, List <object> methodArgs, string serverSideMethodName = "")
        {
            ShelvedMethod sm = null;

            if (MethodQueue.Any(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any()))
            {
                sm        = MethodQueue.First(m => m.Name == methodName && !m.MethodArgs.Except(methodArgs).Any());
                sm.ExecAt = DateTime.Now;
            }
            else
            {
                // 原理 有重發需求的方法應在此記錄,並產生確認碼並隨方法送回伺服器,伺服器收到後會將確認碼(CmdCode)回傳回來 客戶端在重新收到確認碼之後才把對應的 ShelvedMethod 清掉 重發的時機則是在狀態改變為已連線時一次重發
                sm = new ShelvedMethod
                {
                    Name                 = methodName,
                    MethodArgs           = methodArgs,
                    ExecAt               = DateTime.Now,
                    CmdCode              = Guid.NewGuid().ToString(),
                    ServerSideMethodName = serverSideMethodName
                };
                MethodQueue.Add(sm);
            }

            SaveMethodQueueToXML();

            return(sm.CmdCode);
        }