Robert 1 жил өмнө
parent
commit
09189affcf

+ 4 - 4
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -383,7 +383,7 @@ namespace EVCB_OCPP.WSServer
                     string sb = responseBuilder.ToString();
                     byte[] data = Encoding.UTF8.GetBytes(sb);
 
-                    session.SendRawData(data, 0, data.Length);
+                    await session.Send(data, 0, data.Length);
                     logger.LogTrace(sb);
                     return false;
                 }
@@ -419,7 +419,7 @@ namespace EVCB_OCPP.WSServer
                 responseBuilder.AppendWithCrCf();
                 string sb = responseBuilder.ToString();
                 byte[] data = Encoding.UTF8.GetBytes(sb);
-                session.SendRawData(data, 0, data.Length);
+                await session.Send(data, 0, data.Length);
 
                 logger.LogInformation(sb);
                 return false;
@@ -447,7 +447,7 @@ namespace EVCB_OCPP.WSServer
                 string sb = responseBuilder.ToString();
                 byte[] data = Encoding.UTF8.GetBytes(sb);
 
-                session.SendRawData(data, 0, data.Length);
+                await session.Send(data, 0, data.Length);
                 logger.LogInformation(sb);
                 return false;
             }
@@ -511,7 +511,7 @@ namespace EVCB_OCPP.WSServer
                     string sb = responseBuilder.ToString();
                     byte[] data = Encoding.UTF8.GetBytes(sb);
 
-                    session.SendRawData(data, 0, data.Length);
+                    await session.Send(data, 0, data.Length);
                     logger.LogInformation(sb);
                     return false;
                 }

+ 0 - 11
EVCB_OCPP.WSServer/Service/WsService/WsClientData.cs

@@ -84,17 +84,6 @@ namespace EVCB_OCPP.WSServer.Service.WsService
             MachineId = SessionID;
         }
 
-        /// <summary>
-        /// Sends the raw binary data to client.
-        /// </summary>
-        /// <param name="data">The data.</param>
-        /// <param name="offset">The offset.</param>
-        /// <param name="length">The length.</param>
-        public void SendRawData(byte[] data, int offset, int length)
-        {
-            Send(data, offset, length);
-        }
-
         internal override void HandleReceivedData(string data)
         {
             stringBuffer += data;

+ 44 - 9
EVCB_OCPP.WSServer/Service/WsService/WsSession.cs

@@ -7,6 +7,8 @@ using System.Net;
 using System.Net.WebSockets;
 using System.Text;
 using System.Threading.Tasks;
+using System.Timers;
+using Timer = System.Timers.Timer;
 
 namespace EVCB_OCPP.WSServer.Service.WsService
 {
@@ -60,12 +62,25 @@ namespace EVCB_OCPP.WSServer.Service.WsService
             while (!token.IsCancellationRequested)
             {
                 var buffer = new byte[1024 * 4];
-                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
-                if (result.CloseStatus.HasValue)
+                WebSocketReceiveResult result = null;
+
+                try
+                {
+                    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
+                }
+                catch (Exception e)
+                {
+                    _ = BruteClose(e.Message);
+                    break;
+                }
+
+                if (result == null || result.CloseStatus.HasValue)
                 {
-                    _ = InternalClose(result.CloseStatus.Value);
+                    //closed gracefully
+                    _ = GracefulClose(result.CloseStatus.Value);
                     break;
                 }
+
                 received += Encoding.UTF8.GetString(buffer, 0, result.Count);
                 //m_ReceiveData?.Invoke(this, received);
                 LastActiveTime = DateTime.UtcNow;
@@ -82,40 +97,60 @@ namespace EVCB_OCPP.WSServer.Service.WsService
 
         }
 
-        internal void Send(string dataString)
+        internal Task Send(string dataString)
         {
             var data = Encoding.UTF8.GetBytes(dataString);
-            ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
+            return Send(data, 0 , data.Length);
         }
 
-        internal void Send(byte[] data, int offset, int length)
+        internal async Task Send(byte[] data, int offset, int length)
         {
-            ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
+            await ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
+            if (ClientWebSocket.State == WebSocketState.Aborted ||
+                ClientWebSocket.State == WebSocketState.Closed)
+            {
+
+            }
         }
 
         internal Task Close()
         {
+            return ServerClose();
+        }
+
+        private Task ServerClose()
+        {
+            SessionClosed?.Invoke(this, "ServerShutdown");
             return InternalClose(WebSocketCloseStatus.NormalClosure, "ServerShutdown");
         }
 
-        private  Task InternalClose(WebSocketCloseStatus closeStatus)
+        private  Task GracefulClose(WebSocketCloseStatus closeStatus)
         {
+            SessionClosed?.Invoke(this, closeStatus.ToString());
             return InternalClose(closeStatus , null);
         }
 
+        private Task BruteClose(string description)
+        {
+            SessionClosed?.Invoke(this, description);
+            return InternalClose(WebSocketCloseStatus.EndpointUnavailable, description);
+        }
+
         private async Task InternalClose(WebSocketCloseStatus closeStatus, string description)
         {
             try
             {
                 await _WebSocket.CloseAsync(closeStatus, description, default);
             }
+            catch
+            { 
+            }
             finally
             {
                 _WebSocket.Dispose();
             }
 
             disconnectCancellationTokenSource.Cancel();
-            SessionClosed?.Invoke(this, closeStatus.ToString());
             EndConnSemaphore.Release();
         }
     }