improvements, fixes

This commit is contained in:
Loretta 2025-11-26 09:42:00 +01:00
parent 1131b5675b
commit 2ecc7b1a7a
9 changed files with 94 additions and 32 deletions

View File

@ -0,0 +1,14 @@
using System.Collections;
namespace AyCode.Core.Interfaces;
public interface IForeignKey
{
}
public interface IForeignCollection<T> : IForeignCollection where T : IEnumerable
{}
public interface IForeignCollection
{}

View File

@ -1,8 +1,9 @@
using AyCode.Interfaces.Entities;
using AyCode.Core.Interfaces;
using AyCode.Interfaces.Entities;
namespace AyCode.Interfaces.Addresses;
public interface IAcAddressForeignKey : IEntityGuid
public interface IAcAddressForeignKey : IEntityGuid, IForeignKey
{
public Guid AddressId { get; set; }
}

View File

@ -1,4 +1,6 @@
namespace AyCode.Interfaces;
using AyCode.Core.Interfaces;
namespace AyCode.Interfaces;
public interface ICustomForeignKeyInt : ICustomForeignKey<int>
{ }
@ -6,7 +8,7 @@ public interface ICustomForeignKeyInt : ICustomForeignKey<int>
public interface ICustomForeignKeyGuid : ICustomForeignKey<Guid>
{ }
public interface ICustomForeignKey<out T>
public interface ICustomForeignKey<out T> : IForeignKey
{
T ForeignKey { get; }
}

View File

@ -1,6 +1,8 @@
namespace AyCode.Interfaces.Messages;
using AyCode.Core.Interfaces;
public interface IAcEmailMessageForeignKey<T>
namespace AyCode.Interfaces.Messages;
public interface IAcEmailMessageForeignKey<T> : IForeignKey
{
public T EmailMessageId { get; set; }
}

View File

@ -1,6 +1,8 @@
namespace AyCode.Interfaces.Profiles;
using AyCode.Core.Interfaces;
public interface IAcProfileForeignKey
namespace AyCode.Interfaces.Profiles;
public interface IAcProfileForeignKey : IForeignKey
{
public Guid ProfileId { get; set; }
}

View File

@ -1,6 +1,8 @@
namespace AyCode.Interfaces.ServiceProviders;
using AyCode.Core.Interfaces;
public interface IAcCompanyForeignKey
namespace AyCode.Interfaces.ServiceProviders;
public interface IAcCompanyForeignKey : IForeignKey
{
public Guid ServiceProviderId { get; set; }
}

View File

@ -1,6 +1,8 @@
namespace AyCode.Interfaces.Users;
using AyCode.Core.Interfaces;
public interface IAcUserForeignKey
namespace AyCode.Interfaces.Users;
public interface IAcUserForeignKey : IForeignKey
{
Guid UserId { get; set; }
}

View File

@ -163,34 +163,36 @@ public abstract class AcWebSignalRHubBase<TSignalRTags, TLogger>(IConfiguration
protected Task ResponseToCaller2(int messageTag, object? content)
=> ResponseToCaller(messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
protected async Task ResponseToCaller(int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.Caller, messageTag, message, requestId);
protected Task ResponseToCaller(int messageTag, ISignalRMessage message, int? requestId)
=> SendMessageToClient(Clients.Caller, messageTag, message, requestId);
protected Task SendMessageToUserId2(string userId, int messageTag, object? content)
=> SendMessageToUserId(userId, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public async Task SendMessageToUserId(string userId, int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.User(userId), messageTag, message, requestId);
public Task SendMessageToUserId(string userId, int messageTag, ISignalRMessage message, int? requestId)
=> SendMessageToClient(Clients.User(userId), messageTag, message, requestId);
public async Task SendMessageToConnectionId2(string connectionId, int messageTag, object? content)
=> await SendMessageToConnectionId(connectionId, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public Task SendMessageToConnectionId2(string connectionId, int messageTag, object? content)
=> SendMessageToConnectionId(connectionId, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public async Task SendMessageToConnectionId(string connectionId, int messageTag, ISignalRMessage message, int? requestId)
=> await SendMessageToClient(Clients.Client(Context.ConnectionId), messageTag, message, requestId);
public Task SendMessageToConnectionId(string connectionId, int messageTag, ISignalRMessage message, int? requestId)
=> SendMessageToClient(Clients.Client(Context.ConnectionId), messageTag, message, requestId);
public async Task SendMessageToOtherClients(int messageTag, object? content)
=> await SendMessageToClient(Clients.Others, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public Task SendMessageToOtherClients(int messageTag, object? content)
=> SendMessageToClient(Clients.Others, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public async Task SendMessageToAllClients(int messageTag, object? content)
=> await SendMessageToClient(Clients.All, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
public Task SendMessageToAllClients(int messageTag, object? content)
=> SendMessageToClient(Clients.All, messageTag, new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content), null);
protected async Task SendMessageToClient(IAcSignalRHubItemServer sendTo, int messageTag, ISignalRMessage message, int? requestId = null)
{
var responseDataMessagePack = message.ToMessagePack(ContractlessStandardResolver.Options);
Logger.Info($"[{(responseDataMessagePack.Length/1024)}kb] Server sending responseDataMessagePack to client; {nameof(requestId)}: {requestId}; ConnectionId: {Context.ConnectionId}; {ConstHelper.NameByValue<TSignalRTags>(messageTag)}");
Logger.Info($"[{(responseDataMessagePack.Length/1024)}kb] Server sending responseDataMessagePack to client; {nameof(requestId)}: {requestId}; Aborted: {Context.ConnectionAborted.IsCancellationRequested}; ConnectionId: {Context.ConnectionId}; {ConstHelper.NameByValue<TSignalRTags>(messageTag)}");
await sendTo.OnReceiveMessage(messageTag, responseDataMessagePack, requestId);
Logger.Info($"Server sent responseDataMessagePack to client; {nameof(requestId)}: {requestId}; Aborted: {Context.ConnectionAborted.IsCancellationRequested}; ConnectionId: {Context.ConnectionId}; {ConstHelper.NameByValue<TSignalRTags>(messageTag)}");
}
public async Task SendMessageToGroup(string groupId, int messageTag, string message)

View File

@ -5,7 +5,10 @@ using AyCode.Core.Helpers;
using AyCode.Core.Loggers;
using AyCode.Interfaces.Entities;
using MessagePack.Resolvers;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Connections;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Logging;
namespace AyCode.Services.SignalRs
{
@ -22,7 +25,7 @@ namespace AyCode.Services.SignalRs
public int ConnectionTimeout = 10000;
public int TransportSendTimeout = 60000;
private const string TagsName = "SignalRTags";
protected AcSignalRClientBase(string fullHubName, AcLoggerBase logger)
{
Logger = logger;
@ -30,11 +33,36 @@ namespace AyCode.Services.SignalRs
//TODO: HubConnectionBuilder constructor!!! - J.
HubConnection = new HubConnectionBuilder()
.WithUrl(fullHubName)
//.WithUrl(fullHubName)
.WithUrl(fullHubName, HttpTransportType.WebSockets,
options =>
{
options.TransportMaxBufferSize = 30_000_000; //Increasing this value allows the client to receive larger messages. default: 65KB; unlimited: 0;;
options.ApplicationMaxBufferSize = 30_000_000; //Increasing this value allows the client to send larger messages. default: 65KB; unlimited: 0;
options.CloseTimeout = TimeSpan.FromSeconds(10); //default: 5 sec.
//options.AccessTokenProvider = null;
//options.HttpMessageHandlerFactory = null;
//options.Headers["CustomData"] = "value";
//options.SkipNegotiation = true;
//options.ClientCertificates = new System.Security.Cryptography.X509Certificates.X509CertificateCollection();
//options.Cookies = new System.Net.CookieContainer();
//options.DefaultTransferFormat = TransferFormat.Text;
//options.Credentials = null;
//options.Proxy = null;
//options.UseDefaultCredentials = true;
//options.WebSocketConfiguration = null;
//options.WebSocketFactory = null;
})
//.ConfigureLogging(logging =>
//{
// logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
// logging.AddConsole();
//})
.WithAutomaticReconnect()
.WithStatefulReconnect()
.WithKeepAliveInterval(TimeSpan.FromSeconds(60))
.WithServerTimeout(TimeSpan.FromSeconds(120))
.WithServerTimeout(TimeSpan.FromSeconds(180))
//.AddMessagePackProtocol(options => {
// options.SerializerOptions = MessagePackSerializerOptions.Standard
// .WithResolver(MessagePack.Resolvers.StandardResolver.Instance)
@ -80,11 +108,18 @@ namespace AyCode.Services.SignalRs
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 sending; {nameof(requestId)}: {requestId}; ConnectionSate: {HubConnection.State}; {ConstHelper.NameByValue(TagsName, messageTag)}");
var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options);
return StartConnection().ContinueWith(_ =>
{
var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options);
if (HubConnection.State != HubConnectionState.Connected)
{
Logger.Error($"Client SendMessageToServerAsync error! ConnectionSate: {HubConnection.State};");
return Task.CompletedTask;
}
return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId);
});
}
@ -125,7 +160,7 @@ namespace AyCode.Services.SignalRs
return GetAllAsync<List<TResponseItem>>(messageTag, response =>
{
var logText = $"GetAllIntoAsync<{typeof(TResponseItem).Name}>(); status: {response.Status}; dataCount: {response.ResponseData?.Count}; {ConstHelper.NameByValue(TagsName, messageTag)};";
intoList.Clear();
if (response.Status == SignalResponseStatus.Success && response.ResponseData != null)
@ -228,7 +263,7 @@ namespace AyCode.Services.SignalRs
var reqId = requestId.Value;
_responseByRequestId[reqId].ResponseDateTime = DateTime.UtcNow;
Logger.Info($"[{_responseByRequestId[reqId].ResponseDateTime.Subtract(_responseByRequestId[reqId].RequestDateTime).TotalMilliseconds:N0}ms][{(messageBytes.Length/1024)}kb]{logText}");
Logger.Info($"[{_responseByRequestId[reqId].ResponseDateTime.Subtract(_responseByRequestId[reqId].RequestDateTime).TotalMilliseconds:N0}ms][{(messageBytes.Length / 1024)}kb]{logText}");
var responseMessage = messageBytes.MessagePackTo<SignalResponseJsonMessage>(ContractlessStandardResolver.Options);