diff --git a/AyCode.Core/Interfaces/IForeignKey.cs b/AyCode.Core/Interfaces/IForeignKey.cs new file mode 100644 index 0000000..68a3e37 --- /dev/null +++ b/AyCode.Core/Interfaces/IForeignKey.cs @@ -0,0 +1,14 @@ +using System.Collections; + +namespace AyCode.Core.Interfaces; + +public interface IForeignKey +{ + +} + +public interface IForeignCollection : IForeignCollection where T : IEnumerable +{} + +public interface IForeignCollection +{} \ No newline at end of file diff --git a/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs b/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs index 51465c2..b25f4e2 100644 --- a/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs +++ b/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs @@ -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; } } \ No newline at end of file diff --git a/AyCode.Interfaces/ICustomForeignKey.cs b/AyCode.Interfaces/ICustomForeignKey.cs index 7851f33..839f7fa 100644 --- a/AyCode.Interfaces/ICustomForeignKey.cs +++ b/AyCode.Interfaces/ICustomForeignKey.cs @@ -1,4 +1,6 @@ -namespace AyCode.Interfaces; +using AyCode.Core.Interfaces; + +namespace AyCode.Interfaces; public interface ICustomForeignKeyInt : ICustomForeignKey { } @@ -6,7 +8,7 @@ public interface ICustomForeignKeyInt : ICustomForeignKey public interface ICustomForeignKeyGuid : ICustomForeignKey { } -public interface ICustomForeignKey +public interface ICustomForeignKey : IForeignKey { T ForeignKey { get; } } \ No newline at end of file diff --git a/AyCode.Interfaces/Messages/IAcEmailMessageForeignKey.cs b/AyCode.Interfaces/Messages/IAcEmailMessageForeignKey.cs index 35c16c2..e44c1b2 100644 --- a/AyCode.Interfaces/Messages/IAcEmailMessageForeignKey.cs +++ b/AyCode.Interfaces/Messages/IAcEmailMessageForeignKey.cs @@ -1,6 +1,8 @@ -namespace AyCode.Interfaces.Messages; +using AyCode.Core.Interfaces; -public interface IAcEmailMessageForeignKey +namespace AyCode.Interfaces.Messages; + +public interface IAcEmailMessageForeignKey : IForeignKey { public T EmailMessageId { get; set; } } diff --git a/AyCode.Interfaces/Profiles/IAcProfileForeignKey.cs b/AyCode.Interfaces/Profiles/IAcProfileForeignKey.cs index 8234ab9..f1ada2b 100644 --- a/AyCode.Interfaces/Profiles/IAcProfileForeignKey.cs +++ b/AyCode.Interfaces/Profiles/IAcProfileForeignKey.cs @@ -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; } } \ No newline at end of file diff --git a/AyCode.Interfaces/ServiceProviders/IAcCompanyForeignKey.cs b/AyCode.Interfaces/ServiceProviders/IAcCompanyForeignKey.cs index bd9e206..b962bef 100644 --- a/AyCode.Interfaces/ServiceProviders/IAcCompanyForeignKey.cs +++ b/AyCode.Interfaces/ServiceProviders/IAcCompanyForeignKey.cs @@ -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; } } \ No newline at end of file diff --git a/AyCode.Interfaces/Users/IAcUserForeignKey.cs b/AyCode.Interfaces/Users/IAcUserForeignKey.cs index 1bf4d8c..88fd98f 100644 --- a/AyCode.Interfaces/Users/IAcUserForeignKey.cs +++ b/AyCode.Interfaces/Users/IAcUserForeignKey.cs @@ -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; } } \ No newline at end of file diff --git a/AyCode.Services.Server/SignalRs/AcWebSignalRHubBase.cs b/AyCode.Services.Server/SignalRs/AcWebSignalRHubBase.cs index ec04426..b44df0e 100644 --- a/AyCode.Services.Server/SignalRs/AcWebSignalRHubBase.cs +++ b/AyCode.Services.Server/SignalRs/AcWebSignalRHubBase.cs @@ -163,34 +163,36 @@ public abstract class AcWebSignalRHubBase(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(messageTag)}"); + Logger.Info($"[{(responseDataMessagePack.Length/1024)}kb] Server sending responseDataMessagePack to client; {nameof(requestId)}: {requestId}; Aborted: {Context.ConnectionAborted.IsCancellationRequested}; ConnectionId: {Context.ConnectionId}; {ConstHelper.NameByValue(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(messageTag)}"); } public async Task SendMessageToGroup(string groupId, int messageTag, string message) diff --git a/AyCode.Services/SignalRs/AcSignalRClientBase.cs b/AyCode.Services/SignalRs/AcSignalRClientBase.cs index 8e44936..2d8381c 100644 --- a/AyCode.Services/SignalRs/AcSignalRClientBase.cs +++ b/AyCode.Services/SignalRs/AcSignalRClientBase.cs @@ -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>(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(ContractlessStandardResolver.Options);