Compare commits

..

No commits in common. "dfa94cd1d98ba542b07bfdd061b10c7b05849953" and "6f7692fcb0dd75ecaa5bbaece99a6f5edbe1c7fe" have entirely different histories.

1 changed files with 17 additions and 38 deletions

View File

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