/// <summary> /// 中间件调用 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task Invoke(HttpContext context) { //判断是否为websocket请求 if (context.WebSockets.IsWebSocketRequest) { //接收客户端 // var cancellationToken = context.RequestAborted; var currentWebSocket = await context.WebSockets.AcceptWebSocketAsync(); var socket = new PayStationWebSocket { WebSocket = currentWebSocket }; _SetStationInfo(socket, context);//设置客户端的数据 await _wsconnMgr.AddSocket(socket); while (socket.WebSocket.State == WebSocketState.Open && (DateTime.Now - socket.CreatTime).TotalSeconds < this.socketStationTimeoutSeconds) { // if (cancellationToken.IsCancellationRequested) break; //处理数据 if (_wsHandler.HasNewOrder(socket))//如果有新的订单,则通知前端新的订单 { await _wsHandler.NotifyStationNewPayOrder(socket); _wsHandler.ClearPayOrderId(socket); } Thread.Sleep(500); } await _wsconnMgr.RemoveSocket(socket); } await this._next(context); }
//获取传入的基础信息 private void _SetStationInfo(PayStationWebSocket socket, HttpContext context) { var qs = context.Request.QueryString; var stationId = Convert.ToInt32(context.Request.Query["stationId"]); var doctorId = Convert.ToInt32(context.Request.Query["doctorId"]); var stationId2 = Convert.ToInt32(context.User.FindFirst("stationId")); var doctorId2 = Convert.ToInt32(context.User.FindFirst("doctorId")); socket.StationId = stationId; socket.DoctorId = doctorId; }
/// <summary> /// 判断是否有新的订单 /// </summary> public bool HasNewOrder(PayStationWebSocket socket) { if (socket.PayOrderId == null) { return(false); } else { return(true); } }
/// <summary> /// 通知工作站新订单情况 ,以方便前端启动新订单支付监控 /// </summary> /// <returns>返回json格式的字符串</returns> public async Task NotifyStationNewPayOrder( PayStationWebSocket socket, CancellationToken cancellationToken = default(CancellationToken)) { var rtn = new { rlt = true, msg = "", payOrderId = socket.PayOrderId, notifyTime = DateTime.Now, stationId = socket.StationId, doctorId = socket.DoctorId }; var buffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(rtn)); var segment = new ArraySegment <byte>(buffer); await socket.WebSocket.SendAsync(segment, WebSocketMessageType.Text, true, cancellationToken); }
/// <summary> /// 清空支付单号 /// </summary> /// <param name="socket"></param> public void ClearPayOrderId(PayStationWebSocket socket) { socket.PayOrderId = null; }