diff --git a/products/ASC.Files/Core/Helpers/DocumentService.cs b/products/ASC.Files/Core/Helpers/DocumentService.cs index 2bda91fade..adb0c8a4ef 100644 --- a/products/ASC.Files/Core/Helpers/DocumentService.cs +++ b/products/ASC.Files/Core/Helpers/DocumentService.cs @@ -29,21 +29,10 @@ namespace ASC.Files.Core.Helpers; -/// -/// Class service connector -/// public static class DocumentService { - /// - /// Timeout to request conversion - /// - public static readonly int Timeout = 120000; - //public static int Timeout = Convert.ToInt32(ConfigurationManagerExtension.AppSettings["files.docservice.timeout"] ?? "120000"); - - /// - /// Number of tries request conversion - /// - public static readonly int MaxTry = 3; + private const int Timeout = 120000; + private static readonly JsonSerializerOptions _bodySettings = new() { @@ -246,8 +235,7 @@ public static async Task CommandRequestAsync(FileUtility fileUt Method = HttpMethod.Post }; - var httpClient = clientFactory.CreateClient(); - httpClient.Timeout = TimeSpan.FromMilliseconds(commandTimeout); + var httpClient = clientFactory.CreateClient(nameof(DocumentService)); var body = new CommandBody { @@ -284,12 +272,20 @@ public static async Task CommandRequestAsync(FileUtility fileUt var bodyString = JsonSerializer.Serialize(body, _bodySettings); request.Content = new StringContent(bodyString, Encoding.UTF8, "application/json"); - string dataResponse; - using (var response = await httpClient.SendAsync(request, cancellationTokenSource.Token)) + try { + using var response = await httpClient.SendAsync(request, cancellationTokenSource.Token); dataResponse = await response.Content.ReadAsStringAsync(cancellationTokenSource.Token); } + catch (HttpRequestException e) when (e.HttpRequestError == HttpRequestError.NameResolutionError) + { + return new CommandResponse + { + Error = ErrorTypes.UnknownError, + ErrorString = e.Message + }; + } try { @@ -340,8 +336,7 @@ public static async Task CommandRequestAsync(FileUtility fileUt Method = HttpMethod.Post }; - var httpClient = clientFactory.CreateClient(); - httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout); + var httpClient = clientFactory.CreateClient(nameof(DocumentService)); var body = new BuilderBody { @@ -722,19 +717,17 @@ private static (int ResultPercent, string responseuri, string convertedFileType) public static class DocumentServiceHttpClientExtension { - public static void AddDocumentServiceHttpClient(this IServiceCollection services) + public static void AddDocumentServiceHttpClient(this IServiceCollection services, IConfiguration configuration) { + services.AddHttpClient(nameof(DocumentService)) - .SetHandlerLifetime(TimeSpan.FromMilliseconds(DocumentService.Timeout)) + .SetHandlerLifetime(TimeSpan.FromMilliseconds(Convert.ToInt32(configuration["files:docservice:timeout"] ?? "5000"))) .AddPolicyHandler((_, _) => HttpPolicyExtensions - .HandleTransientHttpError() - .OrResult(response => - { - return response.IsSuccessStatusCode - ? false - : throw new HttpRequestException($"Response status code: {response.StatusCode}", null, response.StatusCode); - }) - .WaitAndRetryAsync(MaxTry, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))); + .HandleTransientHttpError() + .OrResult(response => response.IsSuccessStatusCode + ? false + : throw new HttpRequestException($"Response status code: {response.StatusCode}", null, response.StatusCode)) + .WaitAndRetryAsync(Convert.ToInt32(configuration["files:docservice:try"] ?? "3"), retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))); } } \ No newline at end of file diff --git a/products/ASC.Files/Server/Startup.cs b/products/ASC.Files/Server/Startup.cs index b9a18760c5..f89278120c 100644 --- a/products/ASC.Files/Server/Startup.cs +++ b/products/ASC.Files/Server/Startup.cs @@ -56,7 +56,7 @@ public override async Task ConfigureServices(IServiceCollection services) services.AddBaseDbContextPool(); services.RegisterQuotaFeature(); services.AddScoped(); - services.AddDocumentServiceHttpClient(); + services.AddDocumentServiceHttpClient(_configuration); services.AddStartupTask() .TryAddSingleton(services); diff --git a/products/ASC.Files/Service/Startup.cs b/products/ASC.Files/Service/Startup.cs index 2e6b0d523a..8de6fbfbd3 100644 --- a/products/ASC.Files/Service/Startup.cs +++ b/products/ASC.Files/Service/Startup.cs @@ -74,6 +74,6 @@ public override async Task ConfigureServices(IServiceCollection services) services.AddSingleton(Channel.CreateUnbounded>()); services.AddSingleton(svc => svc.GetRequiredService>>().Reader); services.AddSingleton(svc => svc.GetRequiredService>>().Writer); - services.AddDocumentServiceHttpClient(); + services.AddDocumentServiceHttpClient(Configuration); } } \ No newline at end of file diff --git a/web/ASC.Web.Api/Startup.cs b/web/ASC.Web.Api/Startup.cs index beec29489b..a3d5072b21 100644 --- a/web/ASC.Web.Api/Startup.cs +++ b/web/ASC.Web.Api/Startup.cs @@ -57,6 +57,7 @@ public override async Task ConfigureServices(IServiceCollection services) .TryAddSingleton(services); services.AddActivePassiveHostedService(_configuration, "WebApiNotifySchedulerService"); + services.AddDocumentServiceHttpClient(_configuration); } public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)