Лучший способ выполнить длинный запрос к БД в классическом ASP? - PullRequest
6 голосов
/ 15 сентября 2009

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

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

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

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

Заранее спасибо,

Фил

CODE

<%
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"

%>

Ответы [ 2 ]

3 голосов
/ 15 сентября 2009

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

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

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

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

1 голос
/ 15 сентября 2009

Проблема, как отмечал 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>
...