//interface //处理调用 protected virtual ReturnPacket InvokeHandler(Object instance, InvokePacket packet, InvokeImplementOperationInfo operationInfo) { ReturnPacket returnPacket = new ReturnPacket(); Object returnObject = null; try { returnPacket.HandleTime = DateTime.Now; returnObject = operationInfo.OperationSchema.MethodInfo.Invoke(instance, packet.ParameterValues); returnPacket.Success = true; returnPacket.Content = returnObject; returnPacket.ContentType = operationInfo.ReturnParameterSchema.ParameterType.FullName; } catch (Exception exc) { returnPacket.Success = false; returnPacket.Message = exc.Message; if (this.ExceptionHanppened != null) { HostExceptionEventArgs eventArgs = new HostExceptionEventArgs(); eventArgs.Exception = exc; this.ExceptionHanppened.Invoke(eventArgs); if (!eventArgs.Handled) { throw exc; } } else { throw exc; } } returnPacket.Elapsed = (Int32)(DateTime.Now - returnPacket.HandleTime).TotalMilliseconds; return(returnPacket); }
// Interface【 Object InvokeRoute(Object data); //将调用路由到指定的服务实例上】 private void InvokeRoute(Object state) { try { HttpListenerContext context = state as HttpListenerContext; //获取调用信息 var invokeTranObject = this._transferSerializer.CreateTransportable(); MemoryStream memoryStream = new MemoryStream(); context.Request.InputStream.CopyTo(memoryStream); invokeTranObject.Load(memoryStream, 0, memoryStream.Length); memoryStream.Dispose(); var invokePacket = this._transferSerializer.DeSerializeToInvokePacket(invokeTranObject); if (invokePacket == null) { goto Close; } //获取服务操作的信息 String operationPath = Utilities.GetOperationPath(invokePacket.InterfaceName, invokePacket.OperationName); var operationInfo = this.GetOperationInfo(operationPath); if (operationInfo == null) { goto Close; } Object serviceInstace = null; switch (operationInfo.ImplementSchema.InstantiateMode) { case InstantiateMode.EachCall: { Func <Object> serviceInstaceFactory = this._serviceInstanceCreateFactoryTable[operationInfo.ImplementSchema.ImplementType]; serviceInstace = serviceInstaceFactory.Invoke(); } break; case InstantiateMode.Singleton: { serviceInstace = this._serviceInstanceTable[operationInfo.ImplementSchema.ImplementType]; } break; } var returnPacket = this.InvokeHandler(serviceInstace, invokePacket, operationInfo); var returnTranObject = this._transferSerializer.SerializeReturnPacket(returnPacket); var returnStream = returnTranObject.GetStream(); context.Response.StatusCode = 200; context.Response.ContentLength64 = returnStream.Length; try { returnStream.CopyTo(context.Response.OutputStream); } finally { returnStream.Close(); } Close: context.Response.Close(); } catch (Exception exc) { HostExceptionEventArgs args = new HostExceptionEventArgs(); args.Exception = exc; args.Handled = false; this.ExceptionHanppened?.Invoke(args); if (!args.Handled) { throw exc; } } //returnStream.CopyTo(context.Response.OutputStream); //returnStream.Close(); }