protected virtual void OnSendToClient(PacketMessage packet) { var clientAddress = packet.Head.Address; byte[] content = packet.Content; if (!packet.Head.EnableGzip) { //gzip压缩包 MessageStructure ds = new MessageStructure(); ds.WriteGzipBuffer(content); packet.Content = ds.ReadBuffer(); } byte[] data = packet.Content; OnSendCompleted(clientAddress, data); }
/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="buffer"></param> /// <returns></returns> public byte[] Receive(string session, byte[] buffer) { Stopwatch watch = new Stopwatch(); watch.Start(); BufferReader reader = new BufferReader(buffer); string routeName = ""; string paramString = reader.ReadPacketString(); #if DEBUG //todo trace TraceLog.ReleaseWrite("Tcp param:{0}", paramString); #endif bool isRoute = false; if (!string.IsNullOrEmpty(paramString) && paramString.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { //检查参数格式:route:name?d=param isRoute = true; string[] paramArray = paramString.Split('?'); if (paramArray.Length == 2) { routeName = paramArray[0].Replace("route:", ""); paramString = "?" + paramArray[1]; } } paramString = HttpUtility.UrlDecode(paramString, Encoding.UTF8); int index = paramString.IndexOf("?d="); if (index != -1) { index += 3; paramString = paramString.Substring(index, paramString.Length - index); } var paramGeter = new ParamGeter(paramString); string remoteAddress = session.RemoteAddress; MessageHead head = ParseMessageHead(paramGeter); head.HasGzip = true; session.UserData = head; MessageStructure ms = new MessageStructure(); #if DEBUG Console.WriteLine("{0}>>请求参数:MsgId:{1},ActionId:{2},ip:{3}", DateTime.Now.ToLongTimeString(), head.MsgId, head.Action, remoteAddress); #endif var settings = ParseRequestSettings(paramGeter, remoteAddress); settings.ParamString = paramString; settings.RouteName = routeName; byte[] sendBuffer = new byte[0]; RequestError error = RequestError.Success; try { if (isRoute) { if (CheckCallAccessLimit(remoteAddress)) { error = RequestError.Unknown; head.ErrorInfo = ErrorCallAccessLimit; } else { ServiceRequest.CallRemote(settings, out sendBuffer); } } else { ServiceRequest.Request(settings, out sendBuffer); } } catch (CommunicationObjectFaultedException fault) { TraceLog.WriteError("The wcfclient request faulted:{0}", fault); error = RequestError.Closed; ServiceRequest.ResetChannel(settings); } catch (Exception ex) { if (ex.InnerException is SocketException) { var sex = ex.InnerException as SocketException; TraceLog.WriteError("The wcfclient request connect:{0}-{1}", sex.SocketErrorCode, sex); if (sex.SocketErrorCode == SocketError.TimedOut) { error = RequestError.Timeout; } else { error = RequestError.UnableConnect; } } else { TraceLog.WriteError("The wcfclient request error:{0}", ex); error = RequestError.Unknown; } ServiceRequest.ResetChannel(settings); } watch.Stop(); switch (error) { case RequestError.Success: ms.WriteGzipBuffer(sendBuffer); string msg = string.Format("[{0}]请求响应{1}:route={8},MsgId={2},St={3},Action-{4},error:{5}-{6},bytes:{7},响应时间:{9}ms\r\n", DateTime.Now.ToLongTimeString(), session.RemoteAddress, head.MsgId, head.St, head.Action, head.ErrorCode, head.ErrorInfo, sendBuffer.Length, routeName, (int)watch.Elapsed.TotalMilliseconds); TraceLog.ReleaseWrite(msg); #if DEBUG #endif Console.WriteLine(msg); break; case RequestError.Closed: case RequestError.NotFindService: head.ErrorInfo = ErrorNotFind; DoWriteError(ms, head); break; case RequestError.UnableConnect: head.ErrorInfo = ErrorConnected; DoWriteError(ms, head); break; case RequestError.Timeout: head.ErrorInfo = ErrorTimeout; DoWriteError(ms, head); break; case RequestError.Unknown: DoWriteError(ms, head); break; default: throw new ArgumentOutOfRangeException("RequestError", error, "Not process RequestError enum."); } sendBuffer = ms.ReadBuffer(); return(sendBuffer); }