improvements, fixes, etc...
This commit is contained in:
parent
6f7692fcb0
commit
f007ddf664
|
|
@ -10,9 +10,26 @@ 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, object?> _responseByRequestId = new();
|
private readonly ConcurrentDictionary<int, SignalRRequestModel> _responseByRequestId = new();
|
||||||
|
|
||||||
protected readonly HubConnection HubConnection;
|
protected readonly HubConnection HubConnection;
|
||||||
protected readonly AcLoggerBase Logger;
|
protected readonly AcLoggerBase Logger;
|
||||||
|
|
@ -21,6 +38,7 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
@ -74,9 +92,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(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);
|
var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options);
|
||||||
return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId);
|
return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId);
|
||||||
|
|
@ -119,15 +137,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(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
|
Logger.DebugConditional($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client SendMessageToServerAsync<TResult>; {nameof(requestId)}: {requestId};");
|
||||||
|
|
||||||
_responseByRequestId[requestId] = null;
|
_responseByRequestId[requestId] = new SignalRRequestModel();
|
||||||
await SendMessageToServerAsync(messageTag, message, requestId);
|
await SendMessageToServerAsync(messageTag, message, requestId);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId] != null, Timeout, 25) &&
|
if (await TaskHelper.WaitToAsync(() => _responseByRequestId[requestId].ResponseByRequestId != null, Timeout, 25) &&
|
||||||
_responseByRequestId.TryRemove(requestId, out var obj) && obj is ISignalResponseMessage<string> responseMessage)
|
_responseByRequestId.TryRemove(requestId, out var obj) && obj.ResponseByRequestId is ISignalResponseMessage<string> responseMessage)
|
||||||
{
|
{
|
||||||
if (responseMessage.Status == SignalResponseStatus.Error || responseMessage.ResponseData == null)
|
if (responseMessage.Status == SignalResponseStatus.Error || responseMessage.ResponseData == null)
|
||||||
{
|
{
|
||||||
|
|
@ -145,7 +163,7 @@ namespace AyCode.Blazor.Components.Services
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
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 _);
|
_responseByRequestId.TryRemove(requestId, out _);
|
||||||
|
|
@ -162,7 +180,7 @@ namespace AyCode.Blazor.Components.Services
|
||||||
|
|
||||||
var requestId = AcDomain.NextUniqueInt32;
|
var requestId = AcDomain.NextUniqueInt32;
|
||||||
|
|
||||||
_responseByRequestId[requestId] = new Action<ISignalResponseMessage<string>>(responseMessage =>
|
_responseByRequestId[requestId] = new SignalRRequestModel(new Action<ISignalResponseMessage<string>>(responseMessage =>
|
||||||
{
|
{
|
||||||
TResponseData? responseData = default;
|
TResponseData? responseData = default;
|
||||||
|
|
||||||
|
|
@ -170,20 +188,19 @@ 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; tag: {messageTag}; Status: {responseMessage.Status}; requestId: {requestId};");
|
else Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client SendMessageToServerAsync<TResponseData> response error; callback; 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(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}");
|
if (message.Length == 0) Logger.Warning($"{logText} message.Length == 0!!!!");
|
||||||
else Logger.Info(logText);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -191,12 +208,15 @@ 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])
|
switch (_responseByRequestId[reqId].ResponseByRequestId)
|
||||||
{
|
{
|
||||||
case null:
|
case null:
|
||||||
_responseByRequestId[reqId] = responseMessage;
|
_responseByRequestId[reqId].ResponseByRequestId = responseMessage;
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
case Action<ISignalResponseMessage<string>> messagePackCallback:
|
case Action<ISignalResponseMessage<string>> messagePackCallback:
|
||||||
|
|
@ -212,12 +232,13 @@ namespace AyCode.Blazor.Components.Services
|
||||||
// return Task.CompletedTask;
|
// return Task.CompletedTask;
|
||||||
|
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_responseByRequestId.TryRemove(reqId, out _);
|
_responseByRequestId.TryRemove(reqId, out _);
|
||||||
}
|
}
|
||||||
|
else Logger.Info(logText);
|
||||||
|
|
||||||
OnMessageReceived(messageTag, message, requestId);
|
OnMessageReceived(messageTag, message, requestId);
|
||||||
}
|
}
|
||||||
|
|
@ -226,7 +247,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; messageTag: {messageTag}; requestId: {requestId}; {ex.Message}", ex);
|
Logger.Error($"{ConstHelper.NameByValue(_tagsName, messageTag)} Client OnReceiveMessage; requestId: {requestId}; {ex.Message}", ex);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue