/// <summary> /// 调用远程端的Api /// 并返回结果数据任务 /// </summary> /// <typeparam name="T">返回值类型</typeparam> /// <param name="session">会话对象</param> /// <param name="taskSetActionTable">任务行为表</param> /// <param name="serializer">序列化工具</param> /// <param name="packet">封包</param> /// <param name="timeout">超时时间</param> /// <exception cref="SocketException"></exception> /// <returns></returns> public static ApiResult <T> InvokeApi <T>(ISession session, TaskSetterTable <long> taskSetActionTable, ISerializer serializer, FastPacket packet, TimeSpan timeout) { var taskSetter = taskSetActionTable.Create <T>(packet.Id, timeout); session.Send(packet.ToArraySegment()); return(new ApiResult <T>(taskSetter)); }
/// <summary> /// 设置Api行为返回的任务结果 /// </summary> /// <param name="requestContext">上下文</param> /// <param name="taskSetActionTable">任务行为表</param> /// <param name="serializer">序列化工具</param> /// <returns></returns> public static bool SetApiActionTaskResult(RequestContext requestContext, TaskSetterTable <long> taskSetActionTable, ISerializer serializer) { var taskSetAction = taskSetActionTable.Remove(requestContext.Packet.Id); if (taskSetAction == null) { return(true); } try { var bytes = requestContext.Packet.Body; var value = serializer.Deserialize(bytes, taskSetAction.ValueType); return(taskSetAction.SetResult(value)); } catch (SerializerException ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); return(taskSetAction.SetException(ex)); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); return(taskSetAction.SetException(new SerializerException(ex))); } }
/// <summary> /// 初始化 /// </summary> private void Init() { this.apiActionTable = new ApiActionTable(Common.GetServiceApiActions(this.GetType())); this.packetIdProvider = new PacketIdProvider(); this.taskSetterTable = new TaskSetterTable <long>(); this.Serializer = new DefaultSerializer(); this.TimeOut = TimeSpan.FromSeconds(30); }
/// <summary> /// 初始化 /// </summary> private void Init() { this.apiActionTable = new ApiActionTable(this.FindApiActions()); this.packetIdProvider = new PacketIdProvider(); this.taskSetterTable = new TaskSetterTable <long>(); this.TimeOut = TimeSpan.FromSeconds(30); this.JsonSerializer = new DefaultDynamicJsonSerializer(); }
/// <summary> /// 调用远程端的Api /// 并返回结果数据任务 /// </summary> /// <typeparam name="T">返回值类型</typeparam> /// <param name="session">会话对象</param> /// <param name="taskSetActionTable">任务行为表</param> /// <param name="serializer">序列化工具</param> /// <param name="packet">封包</param> /// <param name="timeout">超时时间</param> /// <exception cref="SocketException"></exception> /// <returns></returns> public static ApiResult <T> InvokeApi <T>(IChannel session, TaskSetterTable <long> taskSetActionTable, ISerializer serializer, FastPacket packet, TimeSpan timeout) { var taskSetter = taskSetActionTable.Create <T>(packet.Id, timeout); lock (session) session.WriteAndFlushAsync(packet); return(new ApiResult <T>(taskSetter)); }
/// <summary> /// 释放资源 /// </summary> public void Dispose() { this.apiActionTable = null; this.taskSetterTable.Clear(); this.taskSetterTable = null; this.packetIdProvider = null; this.Serializer = null; this.clientSession.CloseSafe(); }
/// <summary> /// 释放资源 /// </summary> public override void Dispose() { base.Dispose(); this.apiActionTable = null; this.taskSetterTable.Clear(); this.taskSetterTable = null; this.packetIdProvider = null; this.Serializer = null; }
/// <summary> /// 设置Api行为返回的任务异常 /// </summary> /// <param name="taskSetActionTable">任务行为表</param> /// <param name="requestContext">请求上下文</param> /// <returns></returns> public static bool SetApiActionTaskException(TaskSetterTable <long> taskSetActionTable, RequestContext requestContext) { var taskSetAction = taskSetActionTable.Remove(requestContext.Packet.Id); if (taskSetAction == null) { return(true); } var exceptionBytes = requestContext.Packet.Body; var message = exceptionBytes == null ? string.Empty : Encoding.UTF8.GetString(exceptionBytes); var exception = new RemoteException(message); return(taskSetAction.SetException(exception)); }
public RpcClient(IPAddress _host, int _port, bool _usessl, string _sslfile, string _sslpassword = "", ISerializer _serializer = null) { host = _host; port = _port; useSSl = _usessl; sslFile = _sslfile; sslPassword = _sslpassword; this.apiActionTable = new ApiActionTable(Common.GetServiceApiActions(this.GetType())); this.packetIdProvider = new PacketIdProvider(); this.taskSetterTable = new TaskSetterTable <long>(); if (_serializer == null) { this.Serializer = new DefaultSerializer(); } else { this.Serializer = _serializer; } this.TimeOut = TimeSpan.FromSeconds(30); }