6 Stimmen

Beste Weg, um eine lange DB-Abfrage in klassischen ASP ausführen?

Ich habe einige Abfragen für eine Website, deren Ausführung aufgrund des Datenmodells und der in den Tabellen enthaltenen Datenmenge sehr lange dauert. Bisher habe ich sie manuell in der Datenbank ausgeführt, um Timeout-Probleme usw. zu vermeiden. Der Eigentümer der Website hat jedoch darum gebeten, dass diese Abfragen auf der Website verfügbar gemacht werden, damit er die Abfrageergebnisse abrufen kann.

Ich hatte daran gedacht, dies über einen .NET-Webdienst zu tun und die klassische ASP-Seite diesen asynchron aufrufen zu lassen. Die Webseite würde den Prozess nur einleiten und den Benutzer dann zu einem anderen Bildschirm weiterleiten. Der Webdienst würde dann die Abfrage ausführen und dem Benutzer die Ergebnisse in einer CSV-Datei per E-Mail zusenden.

Ich kann das aber nicht zum Laufen bringen. Der Dienst läuft gut, wenn ich ihn über den Bildschirm im IE aufrufe, aber der Aufruf über einen Ajax-Aufruf in ASP scheint ein Problem zu sein - es wird kein Fehler generiert, aber die CSV-Datei wird auch nicht erstellt.

Ich habe den klassischen ASP-Code unten beigefügt. Der Dienst hat nur eine Methode mit einem Parameter mit dem Namen email, der vom Typ string ist. Kann jemand einen Fehler darin erkennen? Ist dies der beste Weg, dies zu tun, oder sollte ich einen anderen Ansatz in Betracht ziehen?

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"

%>

3voto

djna Punkte 53789

Der Gedanke, die Arbeit asynchron anzufordern und ihre spätere Lieferung zu vereinbaren, erscheint mir sehr vernünftig. Ich spreche ASP nicht gut genug, um zu wissen, was mit Ihrem Versuch zu tun, aber ist das wirklich ein asnch Aufruf, den Sie dort haben? Würde der seb-Dienst auch von einem HTTP-Verbindungs-Timeout betroffen sein?

Mein Ansatz wäre für eine Ajax-Anfrage, um eine Anfrage auf eine Warteschlange und zurück, keine Notwendigkeit für eine Umleitung, Sie sind immer noch auf der Seite, wo der Benutzer die Anfrage, Ihre JavaScript könnte nur bestätigen, dass die Anfrage gesendet wurde. Alternativ kann Ihre traditionellere "eine Seite senden, die Anforderung speichern, eine andere Seite anzeigen"-Appraoch funktionieren, aber das Speichern ist nur, um die Anforderung in eine Warteschlange zu stellen.

Ein Vorteil des Warteschlangenkonzepts ist, dass durch die Kontrolle der Anzahl der Daemons eine kontrollierte Parallelität bei der Bearbeitung der Anfragen erreicht werden kann, wodurch eine Überlastung der DB vermieden wird. Außerdem können die Warteschlangen bestehen bleiben und eine gemächliche Lieferung der Antworten ermöglichen.

Ich nehme an, dass MS-Warteschlangen dann einen Daemon zulassen, der die Anfragen verarbeitet und die Antworten ausliefert. Offensichtlich funktioniert E-Mail, aber es kommt mir ein wenig unfreundlich vor. Mit Schnittstellen im Ajax-Stil wäre es recht einfach, den Status von Anfragen unsichtbar abzufragen und die Ergebnisse abzurufen, wenn sie fertig sind, oder sogar eine Push-Zustellung der Antworten im Stil von Comet zu verwenden.

1voto

Eduardo Molteni Punkte 37808

Das Problem dabei ist, dass djna ist, dass Sie keine Callback-Funktion aufrufen. Aufgrund des asynchronen Aspekts von Ajax haben Sie eine Callback-Funktion eingerichtet, die ausgeführt wird, wenn der Ajax-Aufruf endet.

Lange Rede kurzer Sinn:
Rufen Sie den Webservice von einer Javascript-Funktion aus auf, vorzugsweise mit JQuery, um browserübergreifende Inkompatibilitäten zu vermeiden.

Code:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X