diff --git a/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs b/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs index ea78ddf..1233e0b 100644 --- a/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs +++ b/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs @@ -10,9 +10,26 @@ using Microsoft.AspNetCore.SignalR.Client; namespace AyCode.Blazor.Components.Services { + public class SignalRRequestModel + { + public DateTime RequestDateTime; + public DateTime ResponseDateTime; + public object? ResponseByRequestId = null; + + public SignalRRequestModel() + { + RequestDateTime = DateTime.UtcNow; + } + + public SignalRRequestModel(object responseByRequestId) : this() + { + ResponseByRequestId = responseByRequestId; + } + + } public abstract class AcSignalRClientBase : IAcSignalRHubClient { - private readonly ConcurrentDictionary _responseByRequestId = new(); + private readonly ConcurrentDictionary _responseByRequestId = new(); protected readonly HubConnection HubConnection; protected readonly AcLoggerBase Logger; @@ -21,6 +38,7 @@ namespace AyCode.Blazor.Components.Services //public event Action OnMessageRequested; public int Timeout = 10000; + private string _tagsName = "SignalRTags"; protected AcSignalRClientBase(string fullHubName, AcLoggerBase logger) { @@ -74,9 +92,9 @@ namespace AyCode.Blazor.Components.Services public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId) { - Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); + Logger.DebugConditional($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client SendMessageToServerAsync; {nameof(requestId)}: {requestId};"); - return StartConnection().ContinueWith(x => + return StartConnection().ContinueWith(_ => { var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options); return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId); @@ -119,15 +137,15 @@ namespace AyCode.Blazor.Components.Services protected virtual async Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int requestId) where TResponse : class { - Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); + Logger.DebugConditional($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client SendMessageToServerAsync; {nameof(requestId)}: {requestId};"); - _responseByRequestId[requestId] = null; + _responseByRequestId[requestId] = new SignalRRequestModel(); await SendMessageToServerAsync(messageTag, message, requestId); try { - if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId] != null, Timeout, 25) && - _responseByRequestId.TryRemove(requestId, out var obj) && obj is ISignalResponseMessage responseMessage) + if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId].ResponseByRequestId != null, Timeout, 25) && + _responseByRequestId.TryRemove(requestId, out var obj) && obj.ResponseByRequestId is ISignalResponseMessage responseMessage) { if (responseMessage.Status == SignalResponseStatus.Error || responseMessage.ResponseData == null) { @@ -145,7 +163,7 @@ namespace AyCode.Blazor.Components.Services } catch (Exception ex) { - Logger.Error($"SendMessageToServerAsync; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex); + Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} SendMessageToServerAsync; requestId: {requestId}; {ex.Message}", ex); } _responseByRequestId.TryRemove(requestId, out _); @@ -162,7 +180,7 @@ namespace AyCode.Blazor.Components.Services var requestId = AcDomain.NextUniqueInt32; - _responseByRequestId[requestId] = new Action>(responseMessage => + _responseByRequestId[requestId] = new SignalRRequestModel(new Action>(responseMessage => { TResponseData? responseData = default; @@ -170,20 +188,19 @@ namespace AyCode.Blazor.Components.Services { responseData = string.IsNullOrEmpty(responseMessage.ResponseData) ? default : responseMessage.ResponseData.JsonTo(); } - else Logger.Error($"Client SendMessageToServerAsync response error; callback; tag: {messageTag}; Status: {responseMessage.Status}; requestId: {requestId};"); + else Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client SendMessageToServerAsync response error; callback; Status: {responseMessage.Status}; requestId: {requestId};"); responseCallback(new SignalResponseMessage(responseMessage.Status, responseData)); - }); + })); return SendMessageToServerAsync(messageTag, message, requestId); } public virtual Task OnReceiveMessage(int messageTag, byte[] message, int? requestId) { - var logText = $"Client OnReceiveMessage; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"; + var logText = $"{ConstHelper.NameByValue(_tagsName, messageTag)} Client OnReceiveMessage; {nameof(requestId)}: {requestId};"; - if (message.Length == 0) Logger.Warning($"message.Length == 0! {logText}"); - else Logger.Info(logText); + if (message.Length == 0) Logger.Warning($"{logText} message.Length == 0!!!!"); try { @@ -191,12 +208,15 @@ namespace AyCode.Blazor.Components.Services { var reqId = requestId.Value; + _responseByRequestId[reqId].ResponseDateTime = DateTime.UtcNow; + Logger.Info($"[{_responseByRequestId[reqId].ResponseDateTime.Subtract(_responseByRequestId[reqId].RequestDateTime).TotalMilliseconds:N0}ms]{logText}"); + var responseMessage = message.MessagePackTo(ContractlessStandardResolver.Options); - switch (_responseByRequestId[reqId]) + switch (_responseByRequestId[reqId].ResponseByRequestId) { case null: - _responseByRequestId[reqId] = responseMessage; + _responseByRequestId[reqId].ResponseByRequestId = responseMessage; return Task.CompletedTask; case Action> messagePackCallback: @@ -212,12 +232,13 @@ namespace AyCode.Blazor.Components.Services // return Task.CompletedTask; default: - Logger.Error($"Client OnReceiveMessage switch; unknown message type: {_responseByRequestId[reqId]?.GetType().Name}"); + Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client OnReceiveMessage switch; unknown message type: {_responseByRequestId[reqId].ResponseByRequestId?.GetType().Name}"); break; } _responseByRequestId.TryRemove(reqId, out _); } + else Logger.Info(logText); OnMessageReceived(messageTag, message, requestId); } @@ -226,7 +247,7 @@ namespace AyCode.Blazor.Components.Services if (requestId.HasValue) _responseByRequestId.TryRemove(requestId.Value, out _); - Logger.Error($"Client OnReceiveMessage; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex); + Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client OnReceiveMessage; requestId: {requestId}; {ex.Message}", ex); throw; }