Как мне запустить асинхронный вызов в asp classic и игнорировать ответ?

Вот суть:

У меня есть звонок, который я хочу сделать в asp, и мне наплевать на ответ. Я просто хочу сделать звонок и не хочу, чтобы страница ждала ответа. Согласно документации, это должно выглядеть примерно так:

dim xmlhttp : set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST", url, true '' setting the 'asynchronous' option to 'true'
xmlhttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
xmlhttp.setRequestHeader "Content-Length", Len(XMLData)
xmlhttp.send XMLData

Это работает замечательно при синхронном вызове, но когда я переключаю асинхронный параметр на "истина", ничего не срабатывает. Из Интернета я могу сделать вывод, что пользователи делают что-то вроде следующего:

While xmlhttp.readyState <> 4
    xmlhttp.waitForResponse 1000
Wend

Неужели я схожу с ума от того, что это больше не похоже на асинхронный вызов, если вы ждете ответа?

поставить линию xmlhttp.waitForResponse 1 сразу после отправки вызовет запрос, но опять же, я не хочу ждать секунду.

Какие-нибудь мысли?

4 ответа

Сегодня я получил ту же проблему. Я решил это с помощью объекта "Microsoft.XMLHTTP".

dim xmlhttp 
set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")
xmlhttp.Open "POST", url, true 
xmlhttp.Send ""

И теперь запрос отправляется асинхронно, и целевой URL был достигнут. Надеюсь, это поможет.

Ключевая проблема здесь заключается в том, что если вы не ждете, и ваш сценарий завершается, компонент ServerXMLHTTP уничтожает себя и в процессе прерывает невыполненный запрос. Вы не можете гарантировать, куда в этот момент попал запрос.

Например, если ваш сервер не успел выполнить выдачу на целевой сервер, он увидит, что он больше не нужен, и не беспокоит.

Даже если было установлено соединение с сервером назначения, запрос, возможно, еще не был передан обработчику. Часто веб-сервер проверяет, что клиент все еще подключен, прежде чем выделять ресурсы для выполнения запроса. Если он увидит, что ваше соединение разорвано, он не потрудится завершить запрос.

Другими словами, в классическом ASP нет надежного способа выполнить эту операцию асинхронно, просто он не предназначен для такого рода вещей. Лучшее, что вы можете получить, - это делать что-то другое, пока ваш сценарий продолжает что-то другое (если у вас есть что-то еще, с чем можно столкнуться), однако, я бы даже не рекомендовал этого, поскольку асинхронный WinHTTP внутри ASP является нестабильным.

Мы используем асинхронный XMLRequest для регистрации ошибок в Fogbugz на наших сайтах ASP. Поскольку это всего лишь сообщение об ошибке, мы не хотим, чтобы наши пользователи оставались без дела в ожидании завершения работы нашего кода, поэтому мы делаем это асинхронно. Это может быть что угодно: отсутствующий конфигурационный файл, тайм-аут БД, отсутствующий поиск в конфигурационном файле и т. Д. Не всегда критические вещи, но полезно знать о них. В этих случаях асинхронная работа приносит удовольствие, а если нет, то это не конец света для нас, но у нас не было с этим проблем. Мы использовали этот скрипт, который мы создали и разместили в другом вопросе:

System.Net.HttpWebRequest в классическом asp?

Как говорит Энтони, хотя это не гарантировано на 100%. В качестве возможного исправления вы можете указать Response.Buffer = true, отобразить весь вывод для пользователя, вызвать Response.Flush, а затем выполнить вызов waitForResponse. Пользователь увидит всю страницу и сможет взаимодействовать с ней без задержек, и это даст вашему асинхронному вызову немного больше времени для завершения.

Другой вариант, если вы все еще хотите использовать объект ServerXMLHTTP (а не клиентский компонент, упомянутый выше Антоном, см. FAQ #4 по адресу http://support.microsoft.com/kb/290761), - создать класс VBScript. Создать экземпляр класса. Установите свойство класса для объекта HTTP. Затем вызовите метод для запуска запроса.

Никогда не разрушайте экземпляр класса - он будет автоматически уничтожен после завершения ASP-страницы. У метода уничтожения классов освободите объект HTTP - это должно дать ему достаточно времени для запуска запроса до его уничтожения.

Другие вопросы по тегам