/// <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); }
/// <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); }
/// <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); }
public ValueTask ReciveAsync(WebSocketClient webSocketClient, WebSocketMessageModel webSocketMessage) { _logger.LogInformation("消息接收,ConnectionId={ConnectionId}", webSocketClient.ConnectionId); return(new ValueTask()); }
/// <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); } }