/// <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); }
/// <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); }