Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Выполнение задачи после ответа Response.End() / 10 сообщений из 10, страница 1 из 1
03.12.2020, 10:50
    #40024159
LVO
LVO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
Или любой другой альтернативный способ.

Суть - есть сервис, который периодически вызывает мою страницу и передает данные.
И он ждет в течении 60 секунд ответ 200, если не дожидается, то отправляет данные повторно.


Обработка данных занимает существенно больше времени.

1. Я пробовал читать поток, потом Response.End() - естественно весь код моей страницы, который идет ниже, уже не выполняется.

2. Пробовал responce.end() ставить в блок try, a мой код в finaly - мой код работает а response ждет его завершения.

3. Пробовал вызывать метод обработки данных асинхронно, а затем response.end()
Это работает примерно 3-5 секунд, ответ 200 уходит, данные обрабатываются, но через 3-5 секунд ошибка "Поток находился в процессе прерывания."

И вот может кто знает, как нормально организовать обработку данных после responce?
...
Рейтинг: 0 / 0
03.12.2020, 10:55
    #40024162
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
LVO,
Исключить константу по времени обработки/ожидания.
...
Рейтинг: 0 / 0
03.12.2020, 11:16
    #40024170
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
Тебе нужно полностью менять подход. HTTP просто не рассчитан на то, чтобы ждать ответа 200 по минуте. По запросу от клиента следует запустить обработку данных в фоне и сразу же вернуть клиенту, например, 202 ("Accepted"). И, если это нужно, то реализовать какой-либо механизм уведомления клиента о завершении обработки (периодический опрос со стороны клиента или отправка клиенту сообщения).
...
Рейтинг: 0 / 0
03.12.2020, 11:17
    #40024171
LVO
LVO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
vb_sub,

Если это о времени ожидания стороннего сервиса в 60 секунд - то, к сожалению, никак. Это совсем стороннее ПО, которое просто раз в час шлет накопленные данные на указанный адрес.
...
Рейтинг: 0 / 0
03.12.2020, 11:24
    #40024172
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
LVO
Это совсем стороннее ПО, которое просто раз в час шлет накопленные данные на указанный адрес.

Ну так клади их куда-нибудь в очередь на обработку, а потом обрабатывай. Ты вот, допустим, приходишь на работу устраиваться - тебя ведь не заставляют сидеть в офисе на ресепшене и ждать пока твое резюме все круги ада пройдет.
...
Рейтинг: 0 / 0
03.12.2020, 11:34
    #40024176
LVO
LVO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
fkthat,

fkthatПо запросу от клиента следует запустить обработку данных в фоне и сразу же вернуть клиенту, например, 202 ("Accepted").
Вот я так и пытался сделать, запуская обработку асинхронно, и возвращая 200 сразу.
Не получилось

fkthatИ, если это нужно, то реализовать какой-либо механизм уведомления клиента о завершении обработки (периодический опрос со стороны клиента или отправка клиенту сообщения).

Вот с учетом того, что уведомлять больше никого не нужно, клиент ждет назад только ОК и всё - какой самый простой и правильный способ реализовать такую обработку?
На вход мне приходит JSON относительно небольшой, с одной HTTP ссылкой внутри, по которой я уже сам забираю данный.
Т.е., по сути, я прочитал входной поток, извлек ссылку, и смело могу отвечать ОК.

Пока в голове какие-то неуклюжие идеи, типа сохранять ссылку (в файл или базу) и шедулером обрабатывать...
...
Рейтинг: 0 / 0
03.12.2020, 11:40
    #40024178
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
LVO
Пока в голове какие-то неуклюжие идеи, типа сохранять ссылку (в файл или базу) и шедулером обрабатывать...

Как раз эта идея вовсе не "неуклюжая" а наоборот самая правильная.
...
Рейтинг: 0 / 0
03.12.2020, 13:35
    #40024218
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
LVO
Вот я так и пытался сделать, запуская обработку асинхронно, и возвращая 200 сразу.
Не получилось


Что не получилось?
...
Рейтинг: 0 / 0
03.12.2020, 15:32
    #40024273
LVO
LVO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
hVostt,

Вообще вот удивительно, но уже получилось.

У меня асинхронный метод был заключен в try-catch. B Catch ошибку "Поток находился в процессе прерывания."

Сейчас я совсем убрал try-catch - и все обрабатывается нормально.
Т.е. мой сервис вызывается, я вызываю асинхронный метод, и сразу возвращаю respone.end()
При этом асинхронный метод 10 минут еще работает, обрабатывая данные, и выполняя полезную работу (о чем пишет информацию в файлики)

Одна беда, без try-catch очень неуютно.
...
Рейтинг: 0 / 0
03.12.2020, 15:38
    #40024276
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение задачи после ответа Response.End()
LVO
Т.е. мой сервис вызывается, я вызываю асинхронный метод, и сразу возвращаю respone.end()

Я что-то не догоняю - а зачем тебе вообще там response.end() нужен?
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Выполнение задачи после ответа Response.End() / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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