Лучший способ выполнить долгий запрос DB в классическом ASP?

У меня есть несколько запросов для веб-сайта, которые занимают много времени для выполнения из-за модели данных и объема данных, сохраненного в таблицах. До сих пор я выполнял их вручную против базы данных для предотвращения любых проблем тайм-аута и т.д. однако владелец сайта попросил их быть сделанным доступным на сайте, таким образом, он может получить результаты запроса.

Я думал о выполнении, это через веб-сервис.NET и наличие классической ASP-страницы называет это асинхронно. Веб-страница просто инициировала бы процесс и прежде, чем перенаправить пользователя на другой экран. Веб-сервис затем выполнил бы запрос и послал бы пользователю по электронной почте результаты в CSV.

Однако я, может казаться, не заставляю это работать. Услуга работает хорошо, если я вызываю ее через экран в IE, но вызов ее через вызов Ajax в ASP, кажется, проблема - никакая ошибка не сгенерирована, но ни один не созданный файл CSV.

Я включил классический код ASP ниже. Сервис только имеет один метод с параметром электронной почты имени, которая имеет строку типа. Кто-либо может видеть что-то не так с ним? Кроме того, это лучший способ сделать это или я должен думать о другом подходе?

КОД

<%
message = "http://wwww.example.com/service/query.asmx/GetResults?email=test"
set req = server.createobject("MSXML2.XMLHTTP")
With req
    .open "GET", message, False
    .setRequestHeader "Content-Type", "text/xml"
    .send
End With

works = req.responseText
response.redirect "http://www.bbc.co.uk"

%>
6
задан Luke Girvin 30 October 2019 в 14:02
поделиться

2 ответа

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

Мой подход заключался бы в том, чтобы запрос Ajax помещал запрос в очередь и возвращался, нет необходимости в перенаправлении, вы все еще находитесь на странице, где пользователь делает запрос, ваш JavaScript может просто подтвердить, что запрос был отправлен. В качестве альтернативы может работать ваша более традиционная оценка «отправить страницу, спрятать запрос, отобразить другую страницу», но спрятать можно просто для помещения запроса в очередь.

Преимущество подхода с очередями состоит в том, что, контролируя количество демонов, мы можем получить управляемый параллелизм при обслуживании запросов - избегая перегрузки БД. Кроме того, очереди могут сохраняться и позволять неторопливую доставку ответов.

Я предполагаю, что затем очереди MS позволяют демону обрабатывать повторный запрос и доставлять ответы. Ясно, что электронная почта работает, но кажется мне немного недружелюбной. С интерфейсами в стиле Ajax было бы довольно легко незаметно опрашивать статус запросов и получать результаты, когда они будут готовы, или даже использовать push-доставку ответов в стиле Comet.

Я предполагаю, что очереди MS позволяют демону обрабатывать повторный запрос и доставлять ответы. Ясно, что электронная почта работает, но кажется мне немного недружелюбной. С интерфейсами в стиле Ajax было бы довольно легко незаметно опрашивать статус запросов и получать результаты, когда они будут готовы, или даже использовать push-доставку ответов в стиле Comet.

Я предполагаю, что очереди MS позволяют демону обрабатывать повторный запрос и доставлять ответы. Ясно, что электронная почта работает, но кажется мне немного недружелюбной. С интерфейсами в стиле Ajax было бы довольно легко незаметно опрашивать статус запросов и получать результаты, когда они будут готовы, или даже использовать push-доставку ответов в стиле Comet.

3
ответ дан 17 December 2019 в 07:07
поделиться

Проблема здесь, как заметил djna , в том, что вы не вызываете функцию обратного вызова. Из-за асинхронного аспекта Ajax вы настроили функцию обратного вызова, которая будет выполняться при завершении вызова Ajax.

Короче говоря:
Вызов веб-службы из функции javascript, предпочтительно с использованием JQuery, чтобы избежать перекрестного просмотра несовместимости

Код:

<div id="results">Processing query. Please wait</div>

<script type="text/javascript">
$(document).ready(function(){
    $("#results").load("http://wwww.mywebsite.com/service/query.asmx/GetResults?email=test&Rnd=" + Math.random().toString()); 
});
</script>
1
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: