u
This commit is contained in:
@@ -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<PackageContract.PackageContractClient>);
|
||||
services.AddScoped(CreateAuthenticatedClient<UserContract.UserContractClient>);
|
||||
services.AddScoped(CreateAuthenticatedClient<UserAddressContract.UserAddressContractClient>);
|
||||
services.AddScoped(CreateAuthenticatedClient<UserOrderContract.UserOrderContractClient>);
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
private static GrpcChannel CreateAuthenticatedChannel(string address, HttpClient httpClient, IServiceProvider serviceProvider)
|
||||
private static TClient CreateAuthenticatedClient<TClient>(IServiceProvider sp)
|
||||
where TClient : class
|
||||
{
|
||||
var localStorage = serviceProvider.GetRequiredService<ILocalStorageService>();
|
||||
var httpClient = sp.GetRequiredService<HttpClient>();
|
||||
var localStorage = sp.GetRequiredService<ILocalStorageService>();
|
||||
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)!;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user