Autor: Dflying Chen ( http://dflying.cnblog.som/ )
Für das Atlas-Programm müssen wir in einigen Fällen eine große Anzahl von Webdiensten in kurzer Zeit aufrufen, z. B. indem wir Benutzer in einer Liste schnell anklicken, um sie zu löschen . Zu diesem Zeitpunkt führen Netzwerkbandbreite, Stabilität usw. häufig zu längeren Verzögerungen. Wenn diese Aufrufe in einer einzigen Anfrage zusammengefasst werden können, müssen Benutzer nur eine Netzwerkverzögerung ertragen, um die Verarbeitungsergebnisse zu erhalten, was indirekt auch die Effizienz verbessert. Es scheint, dass dies keine einfach zu implementierende Funktion ist, aber glücklicherweise verfügt Atlas über eine integrierte Unterstützung für den Batch-Aufruf von Webdiensten. Sie benötigen lediglich eine einfache Einstellung im Programm.
Jede Webdienst-Aufrufanforderung in Atlas hat drei Prioritäten: 0: hoch, 1: mittel, 2: niedrig, und der Standardwert ist mittel.
Beim Aufruf können Sie die Priorität dieses Aufrufs über den Prioritätsparameter angeben (siehe: Calling Web Service in ASP.NET Atlas – Handling Errors, Timeouts, and Responding to User Cancellation Operations). Bei Anrufen mit hoher Priorität wendet Atlas keine Batch-Aufrufe an und sendet die Anfrage jedes Mal sofort; bei Anrufen mit mittlerer und niedriger Priorität bricht Atlas die Anrufe innerhalb eines bestimmten Zeitraums ab (siehe Einführung von WebRequestManager unten). ) zu einer einzigen Anfrage werden zusammen gesendet, oder wenn die Anzahl der anzurufenden Anfragen eine bestimmte Anzahl erreicht (siehe Einführung von WebRequestManager unten). Wenn es zu viele anzurufende Anfragen gibt, werden zuerst Anfragen mit mittlerer Priorität für den Aufruf ausgewählt.
Um die integrierte Batch-Call-Webdienstunterstützung von Atlas zu aktivieren, müssen Sie zunächst den serverseitigen Handler für die Batch-Call-Verarbeitung in web.config registrieren (die standardmäßige Atlas-Website-Vorlage hat diesen Handler aktiviert):
<httpHandlers>
<add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validieren="false"/>
</httpHandlers>
Fügen Sie dann die Anzeigeanweisung von WebRequestManager zum Atlas-XML-Skript der Seite hinzu und stellen Sie die Seite so ein, dass Batch-Aufrufe an den Webdienst zulässig sind: <script type="text/xml-script">
<page xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<Komponenten>
<webRequestManagerbatchSize="5" enableBatching="true"batchDelay="3000" />
</components>
</page>
</script>
Hier müssen Sie auf die folgenden drei Eigenschaften von WebRequestManager achten:
enableBatching: Legen Sie fest, ob die Seite Batch-Aufrufe zulässt. Der Standardwert ist false. Hier sollten wir es auf true setzen.
BatchSize: Legen Sie die maximale Anzahl der in einem Batch-Aufruf enthaltenen Anforderungen fest. Der Standardwert ist 5. Wenn die Anzahl der aufzurufenden Anforderungen diese Einstellung überschreitet, wird die Batch-Anfrage sofort ausgegeben, auch wenn das in „batchDelay“ festgelegte Zeitlimit nicht erreicht wird.
BatchDelay: Legen Sie das Wartezeitlimit für einen Batch-Aufruf fest. Der Standardwert ist 1000 (Millisekunden). Wenn das Wartezeitlimit diese Einstellung überschreitet, wird die Batch-Anfrage sofort ausgegeben, auch wenn die Anzahl der Anfragen in „batchSize“ nicht erreicht wird.
Nach dieser Einstellung werden Stapelaufrufe auf jede Webdienstanforderung auf der Seite angewendet. Daher sollten Sie für einen einzelnen Anruf die Priorität als hoch festlegen.
Schauen wir uns zunächst ein Beispiel an. Schreiben Sie einen Webdienst mit der folgenden Webmethode. Die beiden Parameter stellen die Reihenfolge der Aufgabe (damit wir die Reihenfolge der Aufgabenausführung unterscheiden können) dar:
[WebMethod]
öffentliche Zeichenfolge DoTask(int taskID, int priorität)
{
if (Priorität < 0 || Priorität > 2)
throw new Exception("Priorität kann nur 0, 1 oder 2 sein!");
return string.Format("Aufgabe (ID: {0}, Priorität: {1}) beendet.", taskID, priorität);
}
Befolgen Sie dann den Code am Anfang, um Batch-Aufrufe in web.config zu aktivieren, und fügen Sie WebRequestManager zur Seite hinzu. Vergessen Sie nicht, dass auf der Seite auch ein ScriptManager erforderlich ist, um auf den oben definierten Webdienst zu verweisen: <atlas:ScriptManager ID= „scriptManager“ runat=" server">
<Dienste>
<atlas:ServiceReference Path="SampleService.asmx" />
</Dienste>
</atlas:ScriptManager>
Fügen Sie HTML-Markup hinzu. Die Schaltfläche wird verwendet, um Batch-Aufrufe auszulösen, und das Div wird verwendet, um die Aufrufergebnisse anzuzeigen:
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="result"/>
Schließlich gibt es noch das JavaScript-Skript zum Aufrufen des Webdienstes:
function invokeTasks_onclick()
{
// Ausgabe löschen
$('result').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
var taskID = 0;
Funktion DoTask(Zeiten, Priorität)
{
for (var i = 0; i < times; ++i)
{
SampleService.DoTask(
Aufgaben-ID++,
Priorität,
{onMethodComplete: OnComplete, Priorität: Priorität }
);
}
}
functionOnComplete(result)
{
$('result').innerHTML += result + "<br />";
}
Beachten Sie, dass die Methode „DoTask()“ zwei Parameter akzeptiert: „times“ wird verwendet, um die Anzahl der Aufrufe anzugeben, „priority“ wird verwendet, um die Priorität anzugeben, und wir verwenden eine globale Variable „taskID“, um eine inkrementelle Anforderungssequenz aufrechtzuerhalten.
In diesem Beispiel haben wir zuerst eine Anfrage mit niedriger Priorität aufgerufen, dann eine mit mittlerer Priorität und schließlich zwei mit hoher Priorität.
Da hohe Priorität nicht an Batch-Aufrufen teilnimmt, sehen Sie als Erstes deren Rückgabe:
Da die Gesamtzahl der mittleren und niedrigen Prioritäten 2 beträgt und noch nicht 5 erreicht hat , wird mit einer Verzögerung von 3000 Millisekunden gesendet:
Sie können die Aufrufreihenfolge und die Anzahl der Aufrufe in der Methode invokeTasks_onclick() ändern , um zu analysieren, wie Batch-Aufrufe implementiert werden.
Das Beispielprogramm kann hier heruntergeladen werden: