Auteur : Dflying Chen ( http://dflying.cnblog.som/ )
Pour le programme Atlas, dans certains cas, nous devons appeler un grand nombre de services Web en peu de temps, comme par exemple les utilisateurs d'une liste cliquant rapidement pour supprimer . À l’heure actuelle, la bande passante du réseau, la stabilité, etc. entraînent souvent des délais plus longs. Si ces appels peuvent être regroupés en une seule requête, les utilisateurs n'auront besoin de supporter qu'un seul délai de réseau pour obtenir les résultats du traitement, ce qui améliore également indirectement l'efficacité. Il semble que ce ne soit pas une fonction facile à mettre en œuvre, mais heureusement, Atlas dispose d'un support intégré pour les appels par lots de services Web. Tout ce dont vous avez besoin est un simple paramètre dans le programme.
Chaque demande d'appel de service Web dans Atlas a trois priorités : 0 : élevée, 1 : moyenne, 2 : faible, et la valeur par défaut est moyenne.
Lors d'un appel, vous pouvez spécifier la priorité de cet appel via le paramètre de priorité (veuillez vous référer à : Appel du service Web dans ASP.NET Atlas - Gestion des erreurs, des délais d'attente et réponse aux opérations d'annulation de l'utilisateur). Pour les appels de priorité élevée, Atlas n'applique pas d'appels par lots et enverra la demande immédiatement à chaque fois ; pour les appels de priorité moyenne et faible, Atlas terminera les appels dans un certain délai (veuillez vous référer à l'introduction de WebRequestManager ci-dessous. ) en une seule. Les requêtes individuelles sont envoyées ensemble, ou lorsque le nombre de requêtes à appeler atteint un nombre spécifié (veuillez vous référer à l'introduction de WebRequestManager ci-dessous). S'il y a trop de demandes à appeler, les demandes de priorité moyenne seront sélectionnées pour être appelées en premier.
Pour activer la prise en charge intégrée du service Web d'appel par lots d'Atlas, vous devez d'abord enregistrer le gestionnaire côté serveur pour le traitement des appels par lots dans web.config (le modèle de site Web Atlas par défaut a activé ce gestionnaire) :
<httpHandlers>
<add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
</httpGestionnaires>
Ajoutez ensuite l'instruction d'affichage de WebRequestManager au script Atlas XML de la page et configurez la page pour autoriser les appels par lots au service Web : <script type="text/xml-script">
<page xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<composants>
<webRequestManager batchSize="5" activateBatching="true" batchDelay="3000" />
</composants>
</page>
</script>
Ce à quoi vous devez faire attention ici, ce sont les trois propriétés suivantes de WebRequestManager :
enableBatching : Définissez si la page autorise les appels par lots. La valeur par défaut est false. Ici, nous devrions le définir sur true.
batchSize : définissez le nombre maximum de requêtes incluses dans un appel par lots. La valeur par défaut est 5. Lorsque le nombre de requêtes à appeler dépasse ce paramètre, la requête par lots sera émise immédiatement même si le délai défini dans batchDelay n'est pas atteint.
batchDelay : définissez le délai d’attente pour un appel par lots. La valeur par défaut est 1 000 (millisecondes). Lorsque le délai d'attente dépasse ce paramètre, la demande par lots sera émise immédiatement même si le nombre de demandes dans batchSize n'est pas atteint.
Après ce paramètre, les appels par lots seront appliqués à chaque demande de service Web dans la page. Par conséquent, pour un seul appel, vous devez spécifier sa priorité comme étant élevée.
Regardons un exemple. Tout d'abord, écrivez un service Web, qui a la méthode Web suivante. Les deux paramètres représentent l'ordre de la tâche (afin que nous puissions distinguer l'ordre d'exécution de la tâche) et la priorité :
[WebMethod]
chaîne publique DoTask (int taskID, int priorité)
{
si (priorité < 0 || priorité > 2)
throw new Exception("la priorité ne peut être que 0, 1 ou 2!");
return string.Format("Tâche (ID : {0}, Priorité : {1}) terminée.", taskID, priorité);
}
Suivez ensuite le code du début pour activer les appels par lots dans web.config, et ajoutez WebRequestManager à la page. N'oubliez pas qu'un ScriptManager est également nécessaire sur la page pour référencer le service Web défini ci-dessus : <atlas:ScriptManager ID=. "scriptManager" runat="serveur">
<Prestations>
<atlas:ServiceReference Path="SampleService.asmx" />
</Services>
</atlas:ScriptManager>
Ajoutez un balisage HTML. Le bouton est utilisé pour déclencher des appels par lots et le div est utilisé pour afficher les résultats de l'appel :
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return EnsureTasks_onclick()" />
<div id="result"/>
Enfin, il y a le script JavaScript pour appeler le Web Service :
function EnsureTasks_onclick()
{
// efface la sortie
$('result').innerHTML = '';
Faire une tâche (1, 2);
FaireTâche(1, 1);
FaireTâche(2, 0);
}
var ID tâche = 0 ;
fonction DoTask(fois, priorité)
{
pour (var i = 0; i < fois; ++i)
{
SampleService.DoTask(
ID de tâche++,
priorité,
{onMethodComplete : OnComplete, priorité : priorité }
);
}
}
fonctionOnComplete (résultat)
{
$('result').innerHTML += résultat + "<br />";
}
Notez que la méthode DoTask() accepte deux paramètres : times est utilisé pour spécifier le nombre d'appels, priorité est utilisé pour spécifier la priorité et nous utilisons une variable globale taskID pour maintenir une séquence de requêtes incrémentielle.
Dans cet exemple, nous avons d’abord invoqué une requête de faible priorité, puis une requête de priorité moyenne et enfin deux requêtes de priorité élevée.
Puisque la haute priorité ne participe pas aux appels par lots, la première chose que vous voyez est leur retour :
Puisque le nombre total de priorités moyennes et basses est de 2 et n'a pas encore atteint 5 , il est envoyé après un délai de 3000 millisecondes :
Vous pouvez modifier la séquence d'appel et le nombre d'appels dans la méthode InvokeTasks_onclick() pour analyser la façon dont les appels par lots sont implémentés.
L'exemple de programme peut être téléchargé ici :