ASP.NET, асинхронный вызов другой страницы, немедленно возвращает ответ - PullRequest
0 голосов
/ 13 февраля 2010

Проблема заключается в следующем: внешний сервер отправляет входящие SMS-сообщения, преобразованные в HTTP-запросы, на мою иногда очень трудоемкую страницу .aspx.Если в течение 20 секунд на внешний сервер не будет получен ответ, это считается тайм-аутом, и то же сообщение снова отправляется на мою страницу aspx (и может быть снова ....)

Оптимальное для меня решениебыло бы так, что страница aspx считывает входящее сообщение (как HTTP-запрос к странице aspx), запускает обработку сообщения в другом потоке и немедленно возвращает ответ на внешний сервер.Внешний сервер не интересуется другими вещами, кроме статуса HTTP (обычно 200).Когда обработка сообщения завершена, это приводит к записи в файле журнала приложения.

Обработка сообщения выполняется путем отправки другого веб-запроса на страницу aspx, и я попытался использоватьметод BeginGetResponse для веб-запроса, и создали обработчик для обработки завершенного веб-запроса на странице обработки.Проблема в том, что обработчик, кажется, не вызывается, скорее всего потому, что жизненный цикл страницы aspx завершается до завершения асинхронного веб-запроса.

Есть ли у кого-нибудь хорошее решение для этой проблемы?Я также рассмотрел модель асинхронной страницы, но это также, кажется, не является решением для меня, поскольку ответ должен быть возвращен на внешний сервер до завершения обработки сообщения.

С уважением, Eivind

Ответы [ 2 ]

1 голос
/ 13 февраля 2010

Я бы очень опасался использовать потоки в ASP.Net таким образом. Использование их для использования нескольких ядер - это одно. Использование их для настройки какой-либо техники одновременного реагирования выглядит как рецепт катастрофы. Особенно, когда есть гораздо более элегантное решение.

Ваше приложение ASP.Net должно просто принять сообщение, выбросить его в базу данных и отправить ответ об успешном завершении. Это работа сделана. Работа по доставке сообщения должна выполняться каким-либо сервисом или демоном. Службы Windows довольно трудны для создания и поддержки, поэтому, возможно, просто запланированное задание, которое выполняется каждые 30 секунд или около того, проверка сообщений в очереди в БД вполне подойдет вашим целям.

Я видел, как многие люди пытаются использовать потоки в ASP.Net, когда им действительно нужно просто создать фоновый сервис. Результаты никогда не бывают такими надежными, как можно было бы надеяться.

0 голосов
/ 13 февраля 2010

Асинхронная модель страницы определенно не является решением. Вы пытались использовать событие unload для выполнения EndRequest? Я действительно не знаю, сработает ли это, но стоит попробовать. Самый надежный способ - использовать службу Windows для запуска асинхронного запроса.

...