WsSession.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.Extensions.Primitives;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Net.WebSockets;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace EVCB_OCPP.WSServer.Service.WsService
  10. {
  11. public class WsSession
  12. {
  13. public WsSession()
  14. {
  15. }
  16. public PathString? Path { get; set; }
  17. public string UriScheme { get; set; }
  18. public string AuthHeader { get; set; }
  19. public string SessionID { get; set; }
  20. public Endpoint Endpoint { get; internal set; }
  21. public StringValues Origin { get; internal set; }
  22. public DateTime LastActiveTime { get; set; }
  23. private WebSocket _WebSocket;
  24. public WebSocket ClientWebSocket
  25. {
  26. get => _WebSocket;
  27. set
  28. {
  29. Init(value);
  30. }
  31. }
  32. public WebSocketState State => ClientWebSocket.State;
  33. public string SecWebSocketProtocol => ClientWebSocket.SubProtocol;
  34. public SemaphoreSlim EndConnSemaphore { get; } = new SemaphoreSlim(0);
  35. //public event OCPPClientDataEventHandler<WsSession, String> m_ReceiveData;
  36. public event EventHandler SessionClosed;
  37. private CancellationTokenSource stopReceivCancellationTokenSource = new CancellationTokenSource();
  38. private Task ReceiveLoopTask;
  39. private void Init(WebSocket webSocket)
  40. {
  41. _WebSocket = webSocket;
  42. ReceiveLoopTask = StartReceivd(webSocket, stopReceivCancellationTokenSource.Token);
  43. }
  44. private async Task StartReceivd(WebSocket webSocket, CancellationToken token)
  45. {
  46. while (!token.IsCancellationRequested)
  47. {
  48. var buffer = new byte[1024 * 4];
  49. var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
  50. if (result.CloseStatus.HasValue)
  51. {
  52. Close(CloseReason.ClientClosing);
  53. break;
  54. }
  55. string received = Encoding.UTF8.GetString(buffer, 0, result.Count);
  56. //m_ReceiveData?.Invoke(this, received);
  57. LastActiveTime = DateTime.UtcNow;
  58. HandleReceivedData(received);
  59. }
  60. }
  61. internal virtual void HandleReceivedData(string data)
  62. {
  63. }
  64. internal void Send(string dataString)
  65. {
  66. var data = Encoding.UTF8.GetBytes(dataString);
  67. ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: default);
  68. }
  69. internal void Send(byte[] data, int offset, int length)
  70. {
  71. ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: default);
  72. }
  73. internal void Close(CloseReason closeReason)
  74. {
  75. SessionClosed?.Invoke(this, null);
  76. stopReceivCancellationTokenSource.Cancel();
  77. _WebSocket.Dispose();
  78. EndConnSemaphore.Release();
  79. }
  80. }
  81. }