Here is the IHostedServiceWorker:
public class Worker :using BackgroundService
{System.Data;
private readonly ILogger<Worker>using _logger;System.Data.SqlClient;
private readonly IHttpClientFactoryusing _httpClientFactory;System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using privateSystem.Net.Http.Json;
using readonlySystem.Text;
using IConfigurationPurchaseRazerCodesMultipleRequestService.Modal;
using _configuration;TrendyolGameCodeService.Modal;
public Worker(ILogger<Worker> logger, IHttpClientFactory httpClientFactory, IConfiguration configuration)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
_configuration = configuration;
}
namespace PurchaseRazerCodesMultipleRequestService
{
protected overridepublic asyncclass TaskWorker ExecuteAsync(CancellationToken: stoppingToken)BackgroundService
{
//Timer with 3 mins
var timer = new PeriodicTimer(TimeSpan.FromMinutes(3));
while (await timer.WaitForNextTickAsync(stoppingToken))
private readonly ILogger<Worker> {_logger;
private readonly awaitIHttpClientFactory GetData();_httpClientFactory;
_logger.LogInformation("Worker runningprivate at:readonly {time}",IConfiguration DateTimeOffset.Now);_configuration;
public Worker(ILogger<Worker> logger, IHttpClientFactory httpClientFactory, IConfiguration configuration)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
_configuration = configuration;
}
}
private async Task MakeRequestsToRemoteService(string productCode, long id)
{
protected override async ifTask ExecuteAsync(id <= 0) throw newCancellationToken ArgumentOutOfRangeException(nameof(id)stoppingToken);
try
{
var httpClient = _httpClientFactory.CreateClient("RazerClient");
//Token
httpClient.DefaultRequestHeaders.Accept.Add(///Random Timer
var timer = new PeriodicTimer(TimeSpan.FromMinutes(new MediaTypeWithQualityHeaderValueRandom("application/x-www-form-urlencoded").Next(1, 2)));
var_logger.LogInformation("Timer: tokenContent{timer}", =DateTimeOffset.Now);
new FormUrlEncodedContent while (new[]await timer.WaitForNextTickAsync(stoppingToken))
{
new KeyValuePair<string,await string>GetData("username", "Test"),;
new KeyValuePair<string, string>_logger.LogInformation("password", "123456")
"Worker running at: {time}", DateTimeOffset.Now);
});
using var tokenResponse = await httpClient.PostAsync(_configuration["Token:Production"], tokenContent);}
private async Task MakeRequestsToRemoteService(string productCode, long id, int amount, int bulkId)
{
if ((intid <= 0)tokenResponse.StatusCode ==throw 200new ArgumentOutOfRangeException(nameof(id));
try
{
var tokenhttpClient = await tokenResponse.Content_httpClientFactory.ReadAsStringAsyncCreateClient("RazerClient");
//Call Razer Multi Requests
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",Token
token);
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
#regionvar CalculatetokenContent quantity= new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("username", "Test"),
new KeyValuePair<string, string>("password", "+REyN-#V5!_DgUn+y%hVj7VmyhN^+?%y+Qxkc-bLZR6$uqsYV")
});
var num = amount;
using var firstNumtokenResponse = 50;
var secondNumawait =httpClient.PostAsync(_configuration["Token:Production"], 50;tokenContent);
if (num(int)tokenResponse.StatusCode <== 100200)
{
firstNum = (num + 1) / 2;
var secondNumtoken = num - firstNum;
await }tokenResponse.Content.ReadAsStringAsync();
#endregion //Call Razer Multi Requests
var quantities httpClient.DefaultRequestHeaders.Authorization = new List<int>AuthenticationHeaderValue("Bearer",
{ firstNum, secondNum};
var cts = new CancellationTokenSource( token);
ParallelOptions parallelOptions = new httpClient.DefaultRequestHeaders.Accept.Add()
{
new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
MaxDegreeOfParallelism = 2,
#region Calculate quantity
CancellationToken = cts.Token
var num = amount;
};
var firstNum try= 50;
{
var secondNum = 50;
await Parallel.ForEachAsync(quantities, parallelOptions, async if (quantity,num ct)< =>100)
{
var contentfirstNum = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string,num string>("productCode",+ productCode1),
new KeyValuePair<string, string>("quantity",/ quantity.ToString()),2;
secondNum new= KeyValuePair<string,num string>("clientTrxRef",- bulkId.ToString())firstNum;
});
using var response =
await httpClient.PostAsync(_configuration["Razer:Production"], content, ct);#endregion
var quantities = new ifList<int> { firstNum, secondNum};
var cts = new CancellationTokenSource();
ParallelOptions parallelOptions = new(int)response
{
MaxDegreeOfParallelism = 2,
CancellationToken = cts.StatusCodeToken
== 200 };
try
{
await Parallel.ForEachAsync(quantities, parallelOptions, async (quantity, ct) =>
{
var couponcontent = awaitnew responseFormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("productCode", productCode),
new KeyValuePair<string, string>("quantity", quantity.ContentToString()),
new KeyValuePair<string, string>("clientTrxRef", bulkId.ReadFromJsonAsync<Root>ToString(cancellationToken:))
ct });
_loggerusing var response =
await httpClient.LogInformationPostAsync("REFERENCE ID_configuration["Razer:Production"], {referenceId}"content, coupon.ReferenceIdct);
if ((int)response.StatusCode == 200)
{
var coupon = await response.Content.ReadFromJsonAsync<Root>(cancellationToken: ct);
_logger.LogInformation("REFERENCE ID: {referenceId}", coupon.ReferenceId);
await UpdateData(id);
}
else
{
_logger.LogError("Purchase ServiceError: {statusCode}",
(int)response.StatusCode);
}
});
}
catch (OperationCanceledException ex)
{
_logger.LogError("Operation canceled: {Message}",
ex.Message);
}
}
catch (OperationCanceledException ex)else
{
_logger.LogError("Operation"Token canceledServiceError: {MessagestatusCode}",
ex(int)tokenResponse.MessageStatusCode);
}
}
elsecatch (Exception e)
{
_logger.LogError("Token ServiceError"Error: {statusCodeError} ",
e.Message);
(int)tokenResponse.StatusCode);
}
}
catch (Exception e)
{
_logger.LogError("Error: {Error} ", e.Message);
throw;
}
}
private async Task GetData()
{
var sw = Stopwatch.StartNew();
var connString = _configuration["ConnectionStrings:Default"];
await using var sqlConnection = new SqlConnection(connString);
sqlConnection.Open();
awaitprivate usingasync varTask commandGetData()
= new SqlCommand {
Connection = sqlConnection } var sw = Stopwatch.StartNew();
const string sql var connString = @"Select_configuration["ConnectionStrings:Default"];
TOP 1 Id, BulkId, Amount, ProductCode from BulkPurchases where status await using var sqlConnection = 0";new SqlConnection(connString);
command.CommandText = sql; sqlConnection.Open();
await using var command = new SqlCommand { Connection = sqlConnection };
const string sql = @"Select TOP 1 Id, BulkPurchaseRequestId, Amount, ProductCode from BulkPurchases where status = 0 ORDER BY NEWID()";
command.CommandText = sql;
try
{
await using var reader = await command.ExecuteReaderAsync();
while (reader.Read())try
{
await using var reader = await command.ExecuteReaderAsync();
while (reader.Read())
{
_logger.LogInformation(
"Order {Id}, {BulkId}, {Amount}, {ProductCode}",
reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetString(3));
await MakeRequestsToRemoteService(reader.GetString(3).Trim(), reader.GetInt32(0), reader.GetInt32(2),reader.GetInt32(1));
}
}
}
catch (SqlException exception)
{
_logger.LogError("Error: {Error} ", exception.Message);
throw; // Throw exception if this exception is unexpected
}
sw.Stop();}
_logger.LogInformation($"******** ELAPSED TIME: { sw.Elapsed.TotalSeconds} seconds ********"Stop();
}
private async Task UpdateData(long id)
{
var connString_logger.LogInformation($"******** =ELAPSED _configuration["ConnectionStringsTIME:Default"];
await using var sqlConnection ={sw.Elapsed.TotalSeconds} newseconds SqlConnection(connString********");
sqlConnection.Open();}
awaitprivate usingasync varTask commandUpdateData(long =id)
new SqlCommand { Connection = sqlConnection }; {
const string sql var connString = @"Update_configuration["ConnectionStrings:Default"];
BulkPurchases set status = 1 where Id await using var sqlConnection = @id";new SqlConnection(connString);
command.CommandText = sql; sqlConnection.Open();
await using var command.Parameters.Add( = new SqlParameter("id",SqlCommand id)){ Connection = sqlConnection };
const string sql = @"Update BulkPurchases set status = 1 where Id = @id";
command.CommandText = sql;
command.Parameters.Add(new SqlParameter("id", id));
try
{
await command.ExecuteNonQueryAsync();
}
catch (SqlException exception)
{
_logger.LogError("Error: {Error} ", exception.Message);
throw; // Throw exception if
this exception is unexpected }
}
}
}