diff --git a/src/FrontOffice.Main/ConfigureServices.cs b/src/FrontOffice.Main/ConfigureServices.cs index 84b59d8..042ebd1 100644 --- a/src/FrontOffice.Main/ConfigureServices.cs +++ b/src/FrontOffice.Main/ConfigureServices.cs @@ -33,22 +33,38 @@ public static class ConfigureServices public static IServiceCollection AddGrpcServices(this IServiceCollection services, IConfiguration configuration) { var baseUrl = configuration["GwUrl"]; - var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler())); - httpClient.Timeout = TimeSpan.FromMinutes(10); // TODO Check Timeout - var serviceProvider = services.BuildServiceProvider(); - var channel = CreateAuthenticatedChannel(baseUrl, httpClient, serviceProvider); - services.AddScoped(sp => new PackageContract.PackageContractClient(channel)); - services.AddScoped(sp => new UserContract.UserContractClient(channel)); - services.AddScoped(sp => new UserAddressContract.UserAddressContractClient(channel)); - services.AddScoped(sp => new UserOrderContract.UserOrderContractClient(channel)); + // Register optimized HttpClient for gRPC + services.AddScoped(sp => + { + var handler = new HttpClientHandler + { + MaxConnectionsPerServer = 10, + AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate + }; + + return new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, handler)) + { + Timeout = TimeSpan.FromMinutes(10), + BaseAddress = new Uri(baseUrl) + }; + }); + + // Register gRPC clients with authentication + services.AddScoped(CreateAuthenticatedClient); + services.AddScoped(CreateAuthenticatedClient); + services.AddScoped(CreateAuthenticatedClient); + services.AddScoped(CreateAuthenticatedClient); return services; } - private static GrpcChannel CreateAuthenticatedChannel(string address, HttpClient httpClient, IServiceProvider serviceProvider) + private static TClient CreateAuthenticatedClient(IServiceProvider sp) + where TClient : class { - var localStorage = serviceProvider.GetRequiredService(); + var httpClient = sp.GetRequiredService(); + var localStorage = sp.GetRequiredService(); + var baseUrl = httpClient.BaseAddress?.ToString() ?? throw new InvalidOperationException("Base URL not configured"); var credentials = CallCredentials.FromInterceptor(async (context, metadata) => { @@ -60,22 +76,23 @@ public static class ConfigureServices metadata.Add("Authorization", $"Bearer {token}"); } } - catch (Exception) + catch (Exception ex) { - // Ignore errors during token retrieval +#if DEBUG + Console.WriteLine($"Token retrieval error: {ex.Message}"); +#endif } }); - // SslCredentials is used here because this channel is using TLS. - // CallCredentials can't be used with ChannelCredentials.Insecure on non-TLS channels. - var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(baseUrl, new GrpcChannelOptions { UnsafeUseInsecureChannelCallCredentials = true, Credentials = ChannelCredentials.Create(new SslCredentials(), credentials), HttpClient = httpClient, MaxReceiveMessageSize = 1000 * 1024 * 1024, // 1 GB - MaxSendMessageSize = 1000 * 1024 * 1024 // 1 GB + MaxSendMessageSize = 1000 * 1024 * 1024 // 1 GB }); - return channel; + + return (TClient)Activator.CreateInstance(typeof(TClient), channel)!; } } diff --git a/src/FrontOffice.Main/Pages/Profile/Index.razor b/src/FrontOffice.Main/Pages/Profile/Index.razor index 7f2df06..f212eab 100644 --- a/src/FrontOffice.Main/Pages/Profile/Index.razor +++ b/src/FrontOffice.Main/Pages/Profile/Index.razor @@ -81,56 +81,6 @@ - - -
- تغییر رمز عبور - - - - - - - - - - - - - - - - - - - لغو - - - تغییر رمز عبور - - - -
-
-