|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
Или любой другой альтернативный способ. Суть - есть сервис, который периодически вызывает мою страницу и передает данные. И он ждет в течении 60 секунд ответ 200, если не дожидается, то отправляет данные повторно. Обработка данных занимает существенно больше времени. 1. Я пробовал читать поток, потом Response.End() - естественно весь код моей страницы, который идет ниже, уже не выполняется. 2. Пробовал responce.end() ставить в блок try, a мой код в finaly - мой код работает а response ждет его завершения. 3. Пробовал вызывать метод обработки данных асинхронно, а затем response.end() Это работает примерно 3-5 секунд, ответ 200 уходит, данные обрабатываются, но через 3-5 секунд ошибка "Поток находился в процессе прерывания." И вот может кто знает, как нормально организовать обработку данных после responce? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 10:50 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
LVO, Исключить константу по времени обработки/ожидания. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 10:55 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
Тебе нужно полностью менять подход. HTTP просто не рассчитан на то, чтобы ждать ответа 200 по минуте. По запросу от клиента следует запустить обработку данных в фоне и сразу же вернуть клиенту, например, 202 ("Accepted"). И, если это нужно, то реализовать какой-либо механизм уведомления клиента о завершении обработки (периодический опрос со стороны клиента или отправка клиенту сообщения). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:16 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
vb_sub, Если это о времени ожидания стороннего сервиса в 60 секунд - то, к сожалению, никак. Это совсем стороннее ПО, которое просто раз в час шлет накопленные данные на указанный адрес. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:17 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
LVO Это совсем стороннее ПО, которое просто раз в час шлет накопленные данные на указанный адрес. Ну так клади их куда-нибудь в очередь на обработку, а потом обрабатывай. Ты вот, допустим, приходишь на работу устраиваться - тебя ведь не заставляют сидеть в офисе на ресепшене и ждать пока твое резюме все круги ада пройдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:24 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
fkthat, fkthatПо запросу от клиента следует запустить обработку данных в фоне и сразу же вернуть клиенту, например, 202 ("Accepted"). Вот я так и пытался сделать, запуская обработку асинхронно, и возвращая 200 сразу. Не получилось fkthatИ, если это нужно, то реализовать какой-либо механизм уведомления клиента о завершении обработки (периодический опрос со стороны клиента или отправка клиенту сообщения). Вот с учетом того, что уведомлять больше никого не нужно, клиент ждет назад только ОК и всё - какой самый простой и правильный способ реализовать такую обработку? На вход мне приходит JSON относительно небольшой, с одной HTTP ссылкой внутри, по которой я уже сам забираю данный. Т.е., по сути, я прочитал входной поток, извлек ссылку, и смело могу отвечать ОК. Пока в голове какие-то неуклюжие идеи, типа сохранять ссылку (в файл или базу) и шедулером обрабатывать... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:34 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
LVO Пока в голове какие-то неуклюжие идеи, типа сохранять ссылку (в файл или базу) и шедулером обрабатывать... Как раз эта идея вовсе не "неуклюжая" а наоборот самая правильная. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:40 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
LVO Вот я так и пытался сделать, запуская обработку асинхронно, и возвращая 200 сразу. Не получилось Что не получилось? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 13:35 |
|
Выполнение задачи после ответа Response.End()
|
|||
---|---|---|---|
#18+
hVostt, Вообще вот удивительно, но уже получилось. У меня асинхронный метод был заключен в try-catch. B Catch ошибку "Поток находился в процессе прерывания." Сейчас я совсем убрал try-catch - и все обрабатывается нормально. Т.е. мой сервис вызывается, я вызываю асинхронный метод, и сразу возвращаю respone.end() При этом асинхронный метод 10 минут еще работает, обрабатывая данные, и выполняя полезную работу (о чем пишет информацию в файлики) Одна беда, без try-catch очень неуютно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 15:32 |
|
|
start [/forum/topic.php?fid=18&msg=40024162&tid=1354597]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 142ms |
0 / 0 |