/// <summary> /// 处理正常的数据请求 /// </summary> /// <param name="package">数据包</param> /// <returns></returns> private async Task ProcessRequestAsync(JsonPacket package) { if (package.fromClient == true) { this.SetApiActionTaskResult(package); } else { await this.TryExecuteRequestAsync(package); } }
/// <summary> /// 发送数据包 /// </summary> /// <param name="package">数据包</param> /// <returns></returns> private bool TrySendPackage(JsonPacket package) { try { var packetJson = this.JsonSerializer.Serialize(package); return(this.SendText(packetJson) > 0); } catch (Exception) { return(false); } }
/// <summary> /// 获取Api行为 /// </summary> /// <param name="package">数据包</param> /// <exception cref="ApiNotExistException"></exception> /// <returns></returns> private ApiAction GetApiAction(JsonPacket package) { var action = this.apiActionTable.TryGetAndClone(package.api); if (action == null) { throw new ApiNotExistException(package.api); } else { return(action); } }
/// <summary> /// 调用远程端实现的服务方法 /// </summary> /// <param name="api">api</param> /// <param name="parameters">参数列表</param> /// <exception cref="SocketException"></exception> /// <exception cref="SerializerException"></exception> public void InvokeApi(string api, params object[] parameters) { var packet = new JsonPacket { api = api, id = this.packetIdProvider.NewId(), state = true, fromClient = true, body = parameters }; var packetJson = this.JsonSerializer.Serialize(packet); this.SendText(packetJson); }
/// <summary> /// 调用远程端实现的服务方法 /// </summary> /// <param name="api">api</param> /// <param name="parameters">参数列表</param> /// <exception cref="SocketException"></exception> /// <exception cref="SerializerException"></exception> public void InvokeApi(string api, params object[] parameters) { var packet = new JsonPacket { api = api, id = this.Middleware.PacketIdProvider.NewId(), state = true, fromClient = false, body = parameters }; var packetJson = this.Middleware.JsonSerializer.Serialize(packet); this.session.SendTextAsync(packetJson); }
/// <summary> /// 生成json请求数据包 /// </summary> /// <param name="context">上下文</param> /// <param name="content">内容</param> /// <exception cref="SerializerException"></exception> /// <returns></returns> private JsonPacket GenerateJsonPacket(IContenxt context, string content) { var packet = this.JsonSerializer.Deserialize(content); var jsonPacket = new JsonPacket { api = packet.api, id = packet.id ?? 0, state = packet.state ?? true, fromClient = packet.fromClient ?? true, body = packet.body }; return(jsonPacket); }
/// <summary> /// 处理远返回的程异常 /// </summary> /// <param name="package">数据包</param> private void ProcessRemoteException(JsonPacket package) { var taskSetter = this.taskSetterTable.Take(package.id); if (taskSetter == null) { return; } var body = package.body; var message = body == null ? null : body.ToString(); var exception = new RemoteException(message); taskSetter.SetException(exception); }
/// <summary> /// 设置Api行为的参数值 /// </summary> /// <param name="action">api行为</param> /// <param name="package">数据包</param> /// <exception cref="ArgumentException"></exception> private void SetParameterValues(ApiAction action, JsonPacket package) { var body = package.body as IList; if (body == null) { throw new ArgumentException("body参数必须为数组"); } if (body.Count != action.Parameters.Length) { throw new ArgumentException("body参数数量不正确"); } action.ParametersValues = action.Parameters .Select((p, i) => this.JsonSerializer.Convert(body[i], p.Type)) .ToArray(); }
/// <summary> /// 调用客户端实现的服务方法 /// 并返回结果数据任务 /// </summary> /// <typeparam name="T">返回值类型</typeparam> /// <param name="api">api</param> /// <param name="parameters">参数</param> /// <exception cref="SocketException"></exception> /// <exception cref="SerializerException"></exception> /// <returns>远程数据任务</returns> public Task <T> InvokeApi <T>(string api, params object[] parameters) { var packet = new JsonPacket { api = api, id = this.packetIdProvider.NewId(), state = true, fromClient = true, body = parameters }; // 登记TaskSetAction var task = this.taskSetterTable.Create <T>(packet.id, this.TimeOut); var packetJson = this.JsonSerializer.Serialize(packet); this.SendText(packetJson); return(task); }
/// <summary> /// 调用客户端实现的服务方法 /// 并返回结果数据任务 /// </summary> /// <typeparam name="T">返回值类型</typeparam> /// <param name="api">api</param> /// <param name="parameters">参数</param> /// <exception cref="SocketException"></exception> /// <exception cref="SerializerException"></exception> /// <returns>远程数据任务</returns> public ApiResult <T> InvokeApi <T>(string api, params object[] parameters) { var packet = new JsonPacket { api = api, id = this.middleware.PacketIdProvider.NewId(), state = true, fromClient = false, body = parameters }; // 登记taskSetter var taskSetter = this.middleware.TaskSetterTable.Create <T>(packet.id, this.middleware.TimeOut); var packetJson = this.middleware.JsonSerializer.Serialize(packet); this.session.SendText(packetJson); return(new ApiResult <T>(taskSetter)); }
/// <summary> /// 获取数据包 /// </summary> /// <param name="content">内容</param> /// <returns></returns> private JsonPacket TryGetJsonPacket(string content) { try { var packet = this.JsonSerializer.Deserialize(content); var jsonPacket = new JsonPacket { api = packet.api, id = packet.id ?? 0, state = packet.state ?? true, fromClient = packet.fromClient ?? true, body = packet.body }; return(jsonPacket); } catch (Exception) { return(null); } }
/// <summary> /// 生成json请求数据包 /// </summary> /// <param name="text">内容</param> /// <returns></returns> private JsonPacket GenerateJsonPacket(string text) { try { var packet = this.JsonSerializer.Deserialize(text); var jsonPacket = new JsonPacket { api = packet.api, id = packet.id ?? 0, state = packet.state ?? true, fromClient = packet.fromClient ?? true, body = packet.body }; return(jsonPacket); } catch (Exception ex) { this.OnException(ex); return(null); } }
/// <summary> /// 执行请求 /// </summary> /// <param name="package">数据包</param> /// <returns></returns> private async Task TryExecuteRequestAsync(JsonPacket package) { try { var action = this.GetApiAction(package); var parameters = this.GetAndUpdateParameterValues(action, package); var result = await action.ExecuteAsync(this, parameters); if (action.IsVoidReturn == false && this.IsConnected) { package.body = result; this.TrySendPackage(package); } } catch (Exception ex) { package.state = false; package.body = ex.Message; this.TrySendPackage(package); this.OnException(ex); } }
/// <summary> /// 设置Api行为的参数值 /// </summary> /// <param name="action">api行为</param> /// <param name="package">数据包</param> /// <exception cref="ArgumentException"></exception> /// <returns></returns> private object[] GetAndUpdateParameterValues(ApiAction action, JsonPacket package) { var body = package.body as IList; if (body == null) { throw new ArgumentException("body参数必须为数组"); } if (body.Count != action.Parameters.Length) { throw new ArgumentException("body参数数量不正确"); } for (var i = 0; i < body.Count; i++) { var parameter = action.Parameters[i]; parameter.Value = this.JsonSerializer.Convert(body[i], parameter.Type); } return(action.Parameters.Select(p => p.Value).ToArray()); }
/// <summary> /// 调用客户端实现的服务方法 /// 并返回结果数据任务 /// </summary> /// <typeparam name="T">返回值类型</typeparam> /// <param name="api">api</param> /// <param name="parameters">参数</param> /// <exception cref="SocketException"></exception> /// <exception cref="SerializerException"></exception> /// <returns>远程数据任务</returns> public Task <T> InvokeApi <T>(string api, params object[] parameters) { var packet = new JsonPacket { api = api, id = this.Server.PacketIdProvider.NewId(), state = true, fromClient = false, body = parameters }; // 登记TaskSetAction var taskSource = new TaskCompletionSource <T>(); var taskSetAction = new TaskSetAction <T>(taskSource); this.Server.TaskSetActionTable.Add(packet.id, taskSetAction); var packetJson = this.Server.JsonSerializer.Serialize(packet); this.SendText(packetJson); return(taskSource.Task); }
/// <summary> /// 尝试获取数据包 /// </summary> /// <param name="context">上下文</param> /// <param name="content">内容</param> /// <returns></returns> private JsonPacket TryGetJsonPacket(IContenxt context, string content) { try { var packet = this.JsonSerializer.Deserialize(content); var jsonPacket = new JsonPacket { api = packet.api, id = packet.id ?? 0, state = packet.state ?? true, fromClient = packet.fromClient ?? true, body = packet.body }; return(jsonPacket); } catch (Exception ex) { var session = (JsonWebSocketSession)context.Session.Wrapper; var requestContext = new RequestContext(session, null, context.AllSessions); this.OnException(requestContext, ex); return(null); } }
/// <summary> /// 获取和更新Api行为的参数值 /// </summary> /// <param name="action">api行为</param> /// <param name="package">数据包</param> /// <exception cref="ArgumentException"></exception> private void UpdateParameterValues(ApiAction action, JsonPacket package) { var body = package.body as IList; if (body == null) { throw new ArgumentException("body参数必须为数组"); } if (body.Count != action.ParameterTypes.Length) { throw new ArgumentException("body参数数量不正确"); } var parameters = new object[body.Count]; for (var i = 0; i < body.Count; i++) { var bodyParameter = body[i]; var parameterType = action.ParameterTypes[i]; parameters[i] = this.JsonSerializer.Convert(bodyParameter, parameterType); } action.ParameterValues = parameters; }
/// <summary> /// 设置Api行为返回的任务结果 /// </summary> /// <param name="package">数据包</param> /// <returns></returns> private bool SetApiActionTaskResult(JsonPacket package) { var taskSetter = this.taskSetterTable.Take(package.id); if (taskSetter == null) { return(true); } try { var body = package.body; var value = this.JsonSerializer.Convert(body, taskSetter.ValueType); return(taskSetter.SetResult(value)); } catch (SerializerException ex) { return(taskSetter.SetException(ex)); } catch (Exception ex) { return(taskSetter.SetException(new SerializerException(ex))); } }
/// <summary> /// 请求上下文 /// </summary> /// <param name="session">当前会话对象</param> /// <param name="packet">数据包对象</param> /// <param name="allSessions">所有会话对象</param> internal RequestContext(JsonWebSocketSession session, JsonPacket packet, IEnumerable <JsonWebSocketSession> allSessions) { this.Session = session; this.Packet = packet; this.AllSessions = allSessions; }
/// <summary> /// 尝试获取数据包 /// </summary> /// <param name="context">上下文</param> /// <param name="content">内容</param> /// <returns></returns> private JsonPacket TryGetJsonPacket(IContenxt context, string content) { try { var packet = this.JsonSerializer.Deserialize(content); var jsonPacket = new JsonPacket { api = packet.api, id = packet.id ?? 0, state = packet.state ?? true, fromClient = packet.fromClient ?? true, body = packet.body }; return jsonPacket; } catch (Exception ex) { var session = context.Session.Wrapper as JsonWebSocketSession; var requestContext = new RequestContext(session, null, context.AllSessions); var exceptionConext = new ExceptionContext(requestContext, ex); this.ExecGlobalExceptionFilters(exceptionConext); return null; } }
/// <summary> /// 请求上下文 /// </summary> /// <param name="session">当前会话对象</param> /// <param name="packet">数据包对象</param> /// <param name="allSessions">所有会话对象</param> internal RequestContext(JsonWebSocketSession session, JsonPacket packet, IEnumerable<JsonWebSocketSession> allSessions) { this.Session = session; this.Packet = packet; this.AllSessions = allSessions; }
/// <summary> /// 请求上下文 /// </summary> /// <param name="session">当前会话对象</param> /// <param name="packet">数据包对象</param> /// <param name="allSessions">所有会话对象</param> internal RequestContext(JsonWebSocketSession session, JsonPacket packet, ISessionProvider allSessions) { this.Session = session; this.Packet = packet; this.AllSessions = allSessions; }
/// <summary> /// 请求上下文 /// </summary> /// <param name="session">当前会话对象</param> /// <param name="packet">数据包对象</param> /// <param name="allSessions">所有会话对象</param> internal RequestContext(JsonWebSocketSession session, JsonPacket packet, ISessionManager allSessions) { this.Session = session; this.Packet = packet; this.AllSessions = allSessions; }