Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
En el artículo anterior de esta serie (Llamar a un servicio web en ASP.NET Atlas: introducción y aplicación simple), estábamos familiarizados con el método más básico para llamar a un servicio web en Atlas, pero en el desarrollo real, simplemente hacemos una solicitud y esperamos. Devolver resultados no es suficiente. La mayoría de nosotros debemos considerar manejar los tiempos de espera de error, etc., y también permitir que los usuarios cancelen las operaciones. Afortunadamente, la encapsulación de Atlas del método web en servicios web también tiene en cuenta plenamente estas necesidades.
Pongamos un ejemplo de método web para ilustrar, por ejemplo, para el siguiente método web:
clase pública ComplexWebService: System.Web.Services.WebService {
[WebMethod]
cadena pública BadMethod (int delayTime, bool throwException)
{
// algo algo
}
}
El mash up de JavaScript generado por Atlas tendrá la siguiente firma: ComplexWebService.BadMethod(
tiempo de retraso,
lanzar excepción,
en método completo,
en el tiempo de espera del método,
en el error de método,
en método abortado,
contexto de usuario,
intervalo de tiempo de espera,
prioridad,
utilizar el método Get,
);
Observe que los dos parámetros del método web se utilizan como los dos primeros parámetros del método JavaScript en orden, y hay algunos parámetros adicionales:
onMethodComplete: especifica el nombre de la función de devolución de llamada que se activa cuando el método se completa y regresa exitosamente. En general, siempre debes especificar este método.
onMethodTimeout: especifica el nombre de la función que se activa cuando se agota el tiempo de ejecución del método.
onMethodError: especifica el nombre de la función que se activa cuando el método encuentra una excepción durante la ejecución.
onMethodAborted: especifique el nombre de la función que se activa cuando el usuario cancela el método durante la ejecución.
userContext: objeto de contexto de usuario, al que se puede acceder mediante las cuatro funciones anteriores.
timeoutInterval: establece el límite de tiempo de espera en milisegundos. El valor predeterminado parece ser 90000. Normalmente no se requieren cambios.
prioridad: establece la prioridad de ejecución de este método. Esta prioridad se utilizará en operaciones AJAX por lotes (mencionadas en el siguiente artículo).
useGetMethod: si se debe utilizar HTTP GET para enviar solicitudes, el valor predeterminado es falso.
El orden de los ocho atributos anteriores debe ser el especificado. Pero a veces solo necesitamos especificar un parámetro más adelante en el pedido y tenemos que escribir los parámetros anteriores al mismo tiempo. Por esta razón, Atlas nos proporciona especialmente otro método de llamada, pasando los ocho parámetros anteriores al método en forma de diccionario. Por ejemplo, cuando solo necesitamos los parámetros onMethodComplete y timeoutInterval, podemos escribir así:
ComplexWebService.BadMethod(
tiempo de retraso,
lanzar excepción,
{
onMethodComplete: completeHandler,
intervalo de tiempo de espera: 10000
}
Bien
, echemos un vistazo al procesamiento común en las cuatro funciones de devolución de llamada anteriores (onMethodComplete, onMethodTimeout, onMethodError y onMethodAborted) en circunstancias normales.
Primero, completemos el método del servicio web al principio:
usar Sistema;
usando System.Web;
utilizando System.Web.Services;
usando System.Web.Services.Protocols
[WebService(Namespace = " http://tempuri.org/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
clase pública ComplexWebService: System.Web.Services.WebService {
[Método Web]
cadena pública BadMethod (int delayTime, bool throwException)
{
si (lanzar excepción)
{
throw new Exception ("¡Lo siento, no me gusta hacer esto!");
}
System.Threading.Thread.Sleep(tiempo de retardo);
devolver "¡Listo!";
}
}
Puede ver que este método tiene dos parámetros: delayTime especifica el retraso del método y throwException especifica si el método arroja una excepción. Al controlar estos dos parámetros y el parámetro timeoutInterval al llamar, podemos simular situaciones de finalización, tiempo de espera y excepción.
Luego, agregue ScriptManager a la página y agregue una referencia a este servicio web:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Servicios>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</Servicios>
</atlas:ScriptManager>
Agregue cuatro botones a la página ASPX para activar las siguientes cuatro situaciones: <div>
Este es un MAL método, puede:<br />
<input id="btnWorkFine" tipo="botón" valor="funciona bien" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" tipo="botón" valor="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" tipo="botón" valor="lanzar una excepción" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" tipo="botón" valor="cancelar" onclick="return btnCanceld_onclick()" />
</div>
Completado normalmente, no especificamos ningún retraso ni excepción en el lado del servidor y le dimos un tiempo de espera razonable (10 segundos):
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0,
FALSO,
enBadMethodComplete,
enBadMethodTimeout,
enBadMethodError,
en BadMethodAborted,
"btnWorkFine_onclick",
10000
);
}
función onBadMethodComplete(resultado)
{
alerta(resultado);
}
Tiempo de espera, especifique el retraso del lado del servidor de 3 segundos, pero el tiempo de espera se establece en solo 1 segundo:
función btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000,
FALSO,
enBadMethodComplete,
enBadMethodTimeout,
enBadMethodError,
en BadMethodAborted,
"btnTimeOut_onclick",
1000
);
}
función onBadMethodTimeout (solicitud, contexto de usuario)
{
var timeoutString = "¡La llamada a '" + userContext + "' falló debido al tiempo de espera!";
alerta(timeoutString);
}
Excepción, especifique la excepción lanzada por el servidor. Tenga en cuenta que puede utilizar el parámetro de respuesta en la función de devolución de llamada para obtener información detallada del error:
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
verdadero,
enBadMethodComplete,
enBadMethodTimeout,
enBadMethodError,
en BadMethodAborted,
"btnThrowException_onclick",
10000
);
}
función onBadMethodError (resultado, respuesta, contexto de usuario)
{
var errorString = "Prueba '" + userContext + "' ¡falló!";
si (resultado == nulo) {
errorString += " Código de estado ='" + respuesta.get_statusCode() + "'";
}
demás {
cadena de error +=
" Mensaje='" + resultado.get_message() +
"'rnstackTrace = " + resultado.get_stackTrace();
}
alerta (cadena de error);
}
Cancelación de usuario, similar a la finalización normal, pero usando request.abort() para cancelar la operación inmediatamente después de realizar la solicitud:
function btnCanceld_onclick() {
solicitud var = ComplexWebService.BadMethod(
2000,
FALSO,
enBadMethodComplete,
enBadMethodTimeout,
enBadMethodError,
en BadMethodAborted,
"btnCanceld_onclick",
10000
);
solicitud.abortar();
}
función onBadMethodAborted (solicitud, contexto de usuario) {
var errorString = "La llamada a '" + userContext + "' falló, ¡la solicitud se canceló!";
alerta (cadena de error);
}
El programa de muestra se puede descargar aquí: