Auteur : Dflying Chen ( http://dflying.cnblogs.com/ )
Dans l'article précédent de cette série (Appel d'un service Web dans ASP.NET Atlas - Introduction et application simple), nous connaissions la méthode la plus élémentaire d'appel d'un service Web dans Atlas, mais dans le développement réel, nous faisons simplement une requête et attendons . Renvoyer les résultats ne suffit pas. La plupart d'entre nous doivent prendre en compte la gestion des délais d'attente en cas d'erreur, etc., et également permettre aux utilisateurs d'annuler les opérations. Heureusement, l'encapsulation par Atlas de la méthode Web dans le service Web prend également pleinement en compte ces besoins.
Donnons un exemple de méthode Web pour illustrer. Par exemple, pour la méthode Web suivante :
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
chaîne publique BadMethod (int delayTime, bool throwException)
{
// quelque chose quelque chose
}
}
Le mash up JavaScript généré par Atlas aura la signature suivante : ComplexWebService.BadMethod(
delayTime,
throwException,
onMethodComplete,
onMethodTimeout,
surErreurMéthode,
onMethodAborted,
contexte utilisateur,
timeoutInterval,
priorité,
utilisezGetMethod,
);
Notez que les deux paramètres de la méthode Web sont utilisés comme les deux premiers paramètres de la méthode JavaScript dans l'ordre, et qu'il existe quelques paramètres supplémentaires :
onMethodComplete : spécifie le nom de la fonction de rappel qui est déclenchée lorsque la méthode se termine et retourne avec succès. En général, vous devez toujours spécifier cette méthode.
onMethodTimeout, : spécifie le nom de la fonction qui est déclenchée lorsque l'exécution de la méthode expire.
onMethodError : spécifie le nom de la fonction qui est déclenchée lorsque la méthode rencontre une exception lors de l'exécution.
onMethodAborted : spécifiez le nom de la fonction qui est déclenchée lorsque la méthode est annulée par l'utilisateur lors de l'exécution.
userContext : objet de contexte utilisateur, accessible dans les quatre fonctions ci-dessus.
timeoutInterval : définissez le délai d'expiration en millisecondes. La valeur par défaut semble être 90 000. Normalement, aucune modification n'est requise.
priorité : définissez la priorité d'exécution de cette méthode. Cette priorité sera utilisée dans les opérations AJAX batch (mentionnées dans le prochain article).
useGetMethod : s'il faut utiliser HTTP GET pour envoyer des requêtes, la valeur par défaut est false.
L'ordre des huit attributs ci-dessus doit être tel que spécifié. Mais parfois, il suffit de spécifier un paramètre plus tard dans la commande, et nous devons écrire les paramètres précédents en même temps. Pour cette raison, Atlas nous propose spécialement une autre méthode d'appel, transmettant les huit paramètres ci-dessus à la méthode sous la forme d'un dictionnaire. Par exemple, lorsque nous n'avons besoin que des paramètres onMethodComplete et timeoutInterval, nous pouvons écrire comme ceci :
ComplexWebService.BadMethod(
delayTime,
throwException,
{
onMethodComplete : completHandler,
timeoutInterval : 10 000
}
);
OK, examinons le traitement commun dans les quatre fonctions de rappel ci-dessus (onMethodComplete, onMethodTimeout, onMethodError et onMethodAborted) dans des circonstances normales à travers un exemple.
Complétons d'abord la méthode Web Service au début :
using System ;
en utilisant System.Web ;
en utilisant System.Web.Services ;
en utilisant System.Web.Services.Protocols ;
[WebService (Namespace = " http://tempuri.org/ ")]
[WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)]
classe publique ComplexWebService : System.Web.Services.WebService {
[WebMethod]
chaîne publique BadMethod (int delayTime, bool throwException)
{
si (lancerException)
{
throw new Exception("Désolé, je n'aime pas faire ça!");
}
System.Threading.Thread.Sleep(delayTime);
return "Terminé!";
}
}
Vous pouvez voir que cette méthode a deux paramètres : delayTime spécifie le délai de la méthode et throwException spécifie si la méthode lève une exception. En contrôlant ces deux paramètres et le paramètre timeoutInterval lors de l'appel, nous pouvons simuler des situations d'achèvement, de délai d'attente et d'exception.
Ensuite, ajoutez ScriptManager à la page et ajoutez une référence à ce service Web :
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Prestations>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</Services>
</atlas:ScriptManager>
Ajoutez quatre boutons à la page ASPX pour déclencher les quatre situations suivantes : <div>
C'est une MAUVAISe méthode, elle peut :<br />
<input id="btnWorkFine" type="button" value="work fine" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="lancer une exception" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="get Cancel" onclick="return btnCanceld_onclick()" />
</div>
Terminé normalement, nous n'avons spécifié aucun délai ni exception côté serveur, et avons donné un délai d'attente raisonnable (10 secondes) :
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0,
FAUX,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnWorkFine_onclick",
10000
);
}
fonction onBadMethodComplete (résultat)
{
alerte (résultat);
}
Timeout, spécifiez le délai côté serveur de 3 secondes, mais le délai d'attente est défini sur seulement 1 seconde :
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000,
FAUX,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnTimeOut_onclick",
1000
);
}
fonction onBadMethodTimeout (requête, userContext)
{
var timeoutString = "L'appel à '" + userContext + "' a échoué en raison d'un délai d'attente!";
alerte(timeoutString);
}
Exception, spécifiez l'exception levée par le serveur. Notez que vous pouvez utiliser le paramètre de réponse dans la fonction de rappel pour obtenir des informations détaillées sur l'erreur :
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
vrai,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnThrowException_onclick",
10000
);
}
fonction onBadMethodError (résultat, réponse, userContext)
{
var errorString = "Test '" + userContext + "' a échoué !";
si (résultat == nul) {
errorString += " Code d'état ='" + réponse.get_statusCode() + "'";
}
autre {
chaîne d'erreur +=
" Message='" + résultat.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
alerte (chaîne d'erreur);
}
Annulation par l'utilisateur, similaire à l'achèvement normal, mais en utilisant request.abort() pour annuler l'opération immédiatement après avoir effectué la requête :
function btnCanceld_onclick() {
var requête = ComplexWebService.BadMethod (
2000,
FAUX,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnCanceld_onclick",
10000
);
request.abort();
}
function onBadMethodAborted (requête, userContext) {
var errorString = "L'appel à '" + userContext + "' a échoué, la requête est abandonnée !";
alerte (chaîne d'erreur);
}
L'exemple de programme peut être téléchargé ici :