Пример #1
0
 /// <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);
     }
 }
Пример #2
0
 /// <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);
     }
 }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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();
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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));
        }
Пример #11
0
 /// <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);
     }
 }
Пример #12
0
 /// <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);
     }
 }
Пример #13
0
        /// <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);
            }
        }
Пример #14
0
        /// <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());
        }
Пример #15
0
        /// <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);
     }
 }
Пример #17
0
        /// <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;
        }
Пример #18
0
        /// <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)));
            }
        }
Пример #19
0
 /// <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;
     }
 }
Пример #21
0
 /// <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;
 }
Пример #22
0
 /// <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;
 }
Пример #23
0
 /// <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;
 }