Пример #1
0
        /// <summary>
        /// 构建消息模型
        /// </summary>
        /// <param name="webSocketMessageType">消息类型</param>
        /// <param name="bytes">接收的内容</param>
        /// <param name="connectionId">连接id</param>
        /// <returns></returns>
        private async Task <WebSocketMessageModel> BuildMessageModel(WebSocketMessageType webSocketMessageType, string connectionId, byte[] bytes)
        {
            //定义接收的对象
            var sendMessageModel = new WebSocketMessageModel();

            //验证消息类型 是否为文本
            if (webSocketMessageType == WebSocketMessageType.Text)
            {
                //反序列化
                sendMessageModel = await bytes.ToDeserializeAsync <WebSocketMessageModel>();

                logger.LogTrace("接收文本消息,{connectionId}", connectionId);
            }
            //验证是否为二进制数据
            else if (webSocketMessageType == WebSocketMessageType.Binary)
            {
                //var res = MessagePack.MessagePackSerializer.ConvertToJson(bytes);
                //if (!res.IsNullOrEmpty())
                //{
                //    sendMessageModel = res.ToDeserialize<WebSocketMessageModel>();
                //}
                throw new NotSupportedException("暂未实现二进制数据接收");
            }
            return(sendMessageModel);
        }
Пример #2
0
 /// <summary>
 /// 发送消息
 /// </summary>
 /// <param name="message">消息内容</param>
 /// <param name="webSocketMessageType">消息类型 默认为文本</param>
 /// <param name="webSocket"></param>
 internal static async Task SendMessage(this System.Net.WebSockets.WebSocket webSocket, WebSocketMessageModel sendMessageModel, WebSocketMessageType webSocketMessageType = WebSocketMessageType.Text)
 {
     //验证连接是否正常
     if (webSocket.State != WebSocketState.Open)
     {
         return;
     }
     if (sendMessageModel.IsNull())
     {
         return;
     }
     //发送
     await webSocket.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(await sendMessageModel.ToJsonAsync())), webSocketMessageType, true, CancellationToken.None);
 }
Пример #3
0
        /// <summary>
        /// 执行接收的外部消息
        /// </summary>
        /// <param name="service"></param>
        /// <param name="currentServiceType">当前上下文的类型</param>
        /// <param name="messageModel">消息模型</param>
        /// <returns></returns>
        private async Task EexecReciveMessage(object service, Type currentServiceType, WebSocketMessageModel messageModel)
        {
            //获取方法
            var methodCacheInfo = MethodCache.Get(currentServiceType, messageModel.action);
            //获取方法的参数
            var parameters = methodCacheInfo.ParameterInfos;

            //是否含有参数
            var isParamater = parameters.Count() > 0;
            //参数信息
            var parameterEntity = parameters.Count() > 0 ?await messageModel.message?.ToString().ToDeserializeAsync(parameters[0].ParameterType) : null;

            //执行操作
            await NarutoWebSocketServiceExpression.ExecAsync(service, messageModel.action, isParamter : isParamater, parameterEntity : parameterEntity, parameterType : isParamater?parameters[0].ParameterType : default).ConfigureAwait(false);
        }
Пример #4
0
 public ValueTask ReciveAsync(WebSocketClient webSocketClient, WebSocketMessageModel webSocketMessage)
 {
     _logger.LogInformation("消息接收,ConnectionId={ConnectionId}", webSocketClient.ConnectionId);
     return(new ValueTask());
 }
Пример #5
0
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="context"></param>
        /// <param name="currentServiceType">当前上下文的类型</param>
        /// <param name="webSocketClient"></param>
        /// <param name="messageModel"></param>
        /// <returns></returns>
        public async Task HandlerAsync(WebSocketClient webSocketClient, Type currentServiceType, WebSocketMessageModel messageModel)
        {
            //获取基类消息
            if (messageModel == null || messageModel.action.IsNullOrEmpty())
            {
                Logger.LogWarning("action={action}:传递的消息不符合约束", messageModel.action);
                return;
            }
            //获取当前租户的服务对象信息
            var service = webSocketClient.Context.RequestServices.GetRequiredService(currentServiceType);

            //验证消息是否为内部的消息
            if (messageModel.action.Equals(NarutoWebSocketServiceMethodEnum.OnConnectionBeginAsync.ToString()) || messageModel.action.Equals(NarutoWebSocketServiceMethodEnum.OnDisConnectionAsync.ToString()))
            {
                Logger.LogTrace("调用内部方法,action={action},ConnectionId={connectionId}", messageModel.action, webSocketClient.ConnectionId);
                await EexecInternalMessage(service, webSocketClient, messageModel).ConfigureAwait(false);
            }
            //验证是否为心跳检查
            else if (string.Compare(messageModel.action, NarutoWebSocketServiceMethodEnum.HeartbeatCheck.ToString(), StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                //不执行任何的操作
                Logger.LogTrace("执行心跳检查,ConnectionId={connectionId}", webSocketClient.ConnectionId);
            }
            else
            {
                Logger.LogTrace("调用外部方法,action={action},ConnectionId={connectionId}", messageModel.action, webSocketClient.ConnectionId);
                await EexecReciveMessage(service, currentServiceType, messageModel).ConfigureAwait(false);
            }
        }