powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
19 сообщений из 19, страница 1 из 1
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097934
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Проект asp.net core 3.1 web-api.
Есть функция контроллера, которая формирует и отправляет POST-запрос к стороннему сервису и получает от него данные при нажатии на кнопку:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
[HttpPost]
        [Route("requestqrcodesreceivingadm")]
        public async Task<IActionResult> RequestQRcodesReceiving([FromBody] DateTimeDTO dateTimeStr)
        {
            string url = "https://ххххх/app/api/barcodes/get.php";
            ReportQrCodeExchange reportQrCodeExchange = new ReportQrCodeExchange();
            ResponseMessageDataQRCode responseData = null;
            string dateTimeNow;
            DateTime dateTimeFront;
 
            if (dateTimeStr != null && dateTimeStr.Date !=null && !dateTimeStr.Date.Equals("") && dateTimeStr.Time != null && !dateTimeStr.Time.Equals(""))
            {
                String[] date = dateTimeStr.Date.Split('-');
                string[] time = dateTimeStr.Time.Split(':');
                dateTimeFront = new DateTime(Convert.ToInt32(date[0]), Convert.ToInt32(date[1]), Convert.ToInt32(date[2]), Convert.ToInt32(time[0]), Convert.ToInt32(time[1]),0);
                dateTimeNow = dateTimeFront.ToString("yyyy-MM-dd hh:mm:ss");
            }
            else
            {
                DateTime dateTimeUTC = DateTime.UtcNow;
                dateTimeNow = dateTimeUTC.AddHours(3).ToString("yyyy-MM-dd hh:mm:ss");
            }           
 
 
            Dictionary<string, string> requestMessageDict = new Dictionary<string, string>
            {
                ["token"] = "ххххххххххххххххххххххххххххххххххххххх",
                ["date"] = dateTimeNow
            };
 
            try
            {
                responseData = await PostRequestFormAsync(url, requestMessageDict, "");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }  
            
            return Ok(reportQrCodeExchange);
        }
 
private async Task<ResponseMessageDataQRCode> PostRequestFormAsync(string url, IEnumerable<KeyValuePair<string, string>> data, string str)
        {
            ResponseMessageDataQRCode responseData = null;
 
            using var request = new HttpRequestMessage(HttpMethod.Post, url)
            {
                Content = new FormUrlEncodedContent(data)
            };
            request.Headers.Add("Application", "remoteData");
            var response = await httpClient.SendAsync(request).ConfigureAwait(false);
            string jsonResponseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {
 
                if (FindItemsToken(jsonResponseData)== JsonTokenType.StartObject) 
                {
                    responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeSuccessfully>(jsonResponseData);
                }
                else if(FindItemsToken(jsonResponseData) == JsonTokenType.StartArray)
                {
                    responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeError>(jsonResponseData);
                }
            }
            else {
                responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeError>(jsonResponseData);
            }
            return responseData;
        }



Нужно чтобы этот запрос уходил автоматически по расписанию.
Узнал, что это можно вроде как сделать с помощью библиотеки
TaskScheduler https://github.com/dahall/taskscheduler.
Не пойму как это сделать в проекте web-api asp.net core, где запрос отправляется из контроллера, которые срабатывает при запросе к нему?
Подскажите как это сделать?
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097938
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
ну выполнится запрос PostRequestFormAsync автоматически и что дальше с результатом этого запроса делать?
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097939
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Vlad__i__mir,
ну выполнится запрос PostRequestFormAsync автоматически и что дальше с результатом этого запроса делать?


Результат обрабатывается и вносит изменения в БД на сервере, но это не важно. Вопрос в том чтобы заставить этот запрос уходить с сервера регулярно автоматически без участия пользователя
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097941
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
Не пойму как это сделать в проекте web-api asp.net core, где запрос отправляется из контроллера, которые срабатывает при запросе к нему?
А что мешает вызвать метод контроллера напрямую?
Но лучше, конечно, вынести вынести общение со сторонней библиотекой в отдельный сервис
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097942
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
регулярно автоматически без участия пользователя
тут обычно рекомендуют quartz net
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40097943
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
можешь сделать IHostedService c таймером, который будет вызывать требуемый метод.
Или воспользоваться библиотекой Quartz.NET - он попроще в конфиге.
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098009
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Vlad__i__mir
регулярно автоматически без участия пользователя
тут обычно рекомендуют quartz net


А есть пример как её правильно настроить/сконфигурировать в файле Startup.cs проекта asp.net core web-api
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098014
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,

В ConfigureServices
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 services.AddQuartz(q =>
         {
          q.UseMicrosoftDependencyInjectionJobFactory();
						 
          var jobLoadingKey = new JobKey("jobLoading");
          q.AddJob<LoadingJob>(opts => opts.WithIdentity(jobLoadingKey));
						 
          q.AddTrigger(opts => opts
          .ForJob(jobLoadingKey)
          .WithIdentity("jobLoading-trigger")
          .StartNow()
          .WithSimpleSchedule(x =>
            x.WithIntervalInMinutes(31)
          .RepeatForever()));					  
          });
					 
 services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098038
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
vb_sub,

Пожалуйста взгляните и поправьте меня, я такого никогда ещё не делал.
Получилось следующее:

Код: c#
1.
2.
3.
4.
5.
public interface IRequestSender
    {
        Task<ResponseMessageDataQRCode> SendRequestAsync(string url, IEnumerable<KeyValuePair<string, string>> data, string str);
        public Task<ReportQrCodeExchange> RequestQRcodesReceiving(string url, Dictionary<string, string> requestDataDict);
    }



Класс реализующий интерфейс IRequestSender и отвечающий за всю работу (отправка запроса, получение ответа, обработка и запись ответа в БД через dbcontext):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
public class RequestSender : IRequestSender
    {
        private readonly HttpClient httpClient;
        private ServicesQRcodes _servicesQRcodes;

        public RequestSender()
        {
            httpClient = new HttpClient();
            _servicesQRcodes = new ServicesQRcodes();
        }

        public async Task<ReportQrCodeExchange> RequestQRcodesReceiving(string url, Dictionary<string, string> requestDataDict)
        {
            ReportQrCodeExchange reportQrCodeExchange = new ReportQrCodeExchange();
            ResponseMessageDataQRCode responseData = null;
            try
            {
                responseData = await SendRequestAsync(url, requestDataDict, "");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (responseData != null)
            {
                if (responseData.status.Equals("200") || responseData.status.Equals("OK"))
                {
                    try
                    {
                        ResponseMessageDataQRCodeSuccessfully responseMessageDataQRCodeSuccessfully = (ResponseMessageDataQRCodeSuccessfully)responseData;
                        reportQrCodeExchange = _servicesQRcodes.CheckQrCodes(responseMessageDataQRCodeSuccessfully);
                    }
                    catch
                    {
                        ResponseMessageDataQRCodeError responseMessageDataQRCodeError = (ResponseMessageDataQRCodeError)responseData;

                        foreach (string str in responseMessageDataQRCodeError.items)
                        {
                            responseMessageDataQRCodeError.items.Append(str);
                        }
                        reportQrCodeExchange.error = responseData.error;
                        reportQrCodeExchange.status = responseData.status;
                        reportQrCodeExchange.dateTimeRequest = responseData.date;
                    }
                }
                else
                {
                    reportQrCodeExchange.error = responseData.error;
                    reportQrCodeExchange.status = responseData.status;
                    reportQrCodeExchange.dateTimeRequest = responseData.date;
                    return reportQrCodeExchange;
                }
            }

            return reportQrCodeExchange;
        }
        public async Task<ResponseMessageDataQRCode> SendRequestAsync(string url, IEnumerable<KeyValuePair<string, string>> data, string str)
        {
            ResponseMessageDataQRCode responseData = null;

            using var request = new HttpRequestMessage(HttpMethod.Post, url)
            {
                Content = new FormUrlEncodedContent(data)
            };
            request.Headers.Add("Application", "remoteData");
            var response = await httpClient.SendAsync(request).ConfigureAwait(false);
            string jsonResponseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {

                if (FindItemsToken(jsonResponseData) == JsonTokenType.StartObject) //indxF==-1 && indxL==-1 && indxF>=indxL
                {
                    responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeSuccessfully>(jsonResponseData);
                }
                else if (FindItemsToken(jsonResponseData) == JsonTokenType.StartArray)
                {
                    responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeError>(jsonResponseData);
                }
            }
            else
            {
                responseData = JsonSerializer.Deserialize<ResponseMessageDataQRCodeError>(jsonResponseData);
            }
            return responseData;
        }

        //Проверка типа объекта в JSON после имени свойства "items"
        private static JsonTokenType FindItemsToken(string json)
        {
            var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json));
            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.PropertyName && reader.GetString() == "items")
                    break;
            }
            if (!reader.Read()) return JsonTokenType.None;

            return reader.TokenType;
        }        

    }
}



Вот этот объект ServicesQRcodes _servicesQRcodes у меня использует dbcontext, экземпляр которого создает у себя внутри. Я переживаю не будет ли каких-нибудь конфликтов или переполнения, будет ли он уничтожаться при завершении задачи?

Класс непосредственно запускающий экземпляр задачи/работы:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
[DisallowConcurrentExecution]
    public class RequestJob : IJob
    {
        private readonly IRequestSender _requestSender;
        private readonly string url = "https://хххххх/app/api/barcodes/get.php";

        public RequestJob(IRequestSender requestSender)
        {
            this._requestSender = requestSender;
        }
        public Task Execute(IJobExecutionContext context)
        {
            string dateTimeRequestStr;
            DateTime dateTimeUTC = DateTime.UtcNow;
            dateTimeRequestStr = dateTimeUTC.AddHours(3).ToString("yyyy-MM-dd hh:mm:ss");

            Dictionary<string, string> requestMessageDict = new Dictionary<string, string>
            {
                ["token"] = "N2U1OThkZDZkZDliZGFiM/lAfhoRNk0D+iJh2Z1h1fpYEUWXkzsbvGg1",
                ["date"] = dateTimeRequestStr
            };
             _requestSender.RequestQRcodesReceiving(url,requestMessageDict);

            // отправили запрос, получили ответ, записали в БД данные ответа
            return Task.CompletedTask;
        }
    }



Класс фабрики управляющей запускам задач/работ:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class SingletonJobFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;
        public SingletonJobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
        }

        public void ReturnJob(IJob job)
        {
        }
    }



Ну и как вы посоветовали настройка всего этого в Startup.cs:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
services.AddQuartz(q =>
            {
                q.UseMicrosoftDependencyInjectionScopedJobFactory();

                // Create a "key" for the job
                var jobKey = new JobKey("RequestJob");

                // Register the job with the DI container
                q.AddJob<RequestJob>(opts => opts.WithIdentity(jobKey));

                // Create a trigger for the job
                q.AddTrigger(opts => opts
                    .ForJob(jobKey) // link to the HelloWorldJob
                    .WithIdentity("RequestJob-trigger") // give the trigger a unique name
                    .StartNow()
                    .WithSimpleSchedule(x =>
                        x.WithIntervalInMinutes(15)
                        .RepeatForever()));
            });
            services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098055
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
код то запускается?
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098063
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Vlad__i__mir,
код то запускается?

Проект собирается, запускается, но протестировать я его не могу, потому что сторонний сервис, на который должны уходить запросы сейчас не доступен.
Он будет доступен завтра и запустить мне нужно будет в реальную эксплуатацию тоже завтра, в общем писец )
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098064
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub, я ещё очень переживаю вот по этому поводу
авторВот этот объект ServicesQRcodes _servicesQRcodes у меня использует dbcontext, экземпляр которого создает у себя внутри. Я переживаю не будет ли каких-нибудь конфликтов или переполнения, будет ли он уничтожаться при завершении задачи?
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098065
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
сделай фэйковый веб-сервер и протести задание.
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098069
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Vlad__i__mir,
сделай фэйковый веб-сервер и протести задание.


поднять сейчас где-то сервер с аналогичным API проблематично, и я же всё равно не смогу проверить момент того, что не будут ли уничтожаться или нет экземпляры объекта класса DbContext используемый в задачах
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098073
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,
ещё не совсем понятно как должен работать класс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class SingletonJobFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;
        public SingletonJobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
        }

        public void ReturnJob(IJob job)
        {
        }
    }



Конкретно, что должен делать метод и что за параметр bundle.JobDetail.JobType мы ему туда передаем, в разных источниках там присутствует разные параметры:
Код: c#
1.
2.
3.
4.
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
        }
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098074
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad__i__mir,
выставил интервал 1 минуту, поставил точку остановы в RequestJob : IJob, по идее если бы задача запустилась бы, тчк остановы должна была сработать, о она не сработала, значит где-то ошибка
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098076
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
IJobFactory можно и не реализовывать. Я не переопределял.
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098083
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Vlad__i__mir,
IJobFactory можно и не реализовывать. Я не переопределял.

Закомментировал этот класс - ничего вообще не моменялось, тчк в RequestJob : IJob не сработала, может что-то я ещё упустил
...
Рейтинг: 0 / 0
Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
    #40098085
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
ищи и у себя косяки-quartz net тема рабочая.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Автоматическая отправка пост-запроса из сервиса asp.net core по расписанию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]