Colección de citas famosas - Slogan de motivación - Llamada al servicio web AJAX en la programación central de ASP.NET 3.5

Llamada al servicio web AJAX en la programación central de ASP.NET 3.5

El modelo AJAX se basa en dos capas: la capa de aplicación cliente y la capa de aplicación servidor. En este modelo, la capa de cliente envía solicitudes a la capa de servidor y la capa de servidor devuelve respuestas a la capa de cliente. Los puntos finales del servidor se identifican mediante URL y exponen datos a los clientes a través de un feed (normalmente un flujo de datos JSON [JavaScript Object Notation]). La capa del servidor es solo una fachada que recibe llamadas y las reenvía a la capa de lógica empresarial de la aplicación.

La siguiente figura muestra el modelo completo:

Para que una página AJAX llame a un servicio remoto, el servicio debe cumplir varios requisitos, el más crítico de los cuales es la ubicación de el punto final y la plataforma subyacente relacionados. Los servicios habilitados para AJAX deben estar ubicados en el mismo dominio que la persona que llama. Esto significa que el servicio debe ser un servicio web XML (punto final .asmx) y debe estar alojado como una aplicación en una aplicación IIS en el mismo servidor web.

En general, para los servicios de aplicaciones AJAX, hay tres formas de definir los servicios de la capa de servidor:

1. Servicio web XML con punto final asmx.

2. Servicio WCF con punto final de servicio.

3. Métodos de página con puntos finales aspx. Estos métodos se definen en la misma página que la página principal de llamada.

La palabra "Servicio" a menudo se utiliza incorrectamente. En AJAX, un servicio se refiere al código que forma parte de una aplicación (ubicada en el dominio de la aplicación) y se utiliza para exponer la funcionalidad correspondiente al cliente. Fundamentalmente, los servicios utilizados por las aplicaciones AJAX generalmente no se comunican a través del Protocolo simple de acceso a objetos (SOAP) (sino que utilizan JSON) y no necesariamente tienen que ser servicios autónomos en una arquitectura orientada a servicios (SOA). Están vinculados a la plataforma y al dominio en el que se encuentran. Por lo tanto, los servicios aquí no pueden denominarse servicios WS-*Web ni servicios SOA.

Servicios REST

Los servicios para aplicaciones AJAX giran en torno a exponer datos y recursos a clientes web. Ambos están disponibles a través de HTTP, lo que requiere que el cliente acceda a los datos y ordene operaciones a través de una URL (que también puede tener encabezados HTTP). La interacción entre el cliente y el servicio se completa mediante acciones como GET, POST, PUT y DELETE. En otras palabras, la URL se usa para describir el recurso que se obtendrá y la acción HTTP se usa para describir la operación realizada en el recurso. Los datos intercambiados durante dichas interacciones están representados por formatos simples o incluso formatos sindicados como RSS y ATOM.

El servicio con estas características es Representational State Transfer (REST).

Serialización de datos

Las llamadas AJAX contienen datos pasados ​​como parámetros al método de servicio llamado y datos devueltos como salida. ¿Cómo se serializan estos datos?

El formato de serialización que ambas partes comunicantes pueden entender es la notación de objetos JavaScript (JSON). JSON es un formato basado en texto diseñado para transmitir el estado de los objetos entre diferentes capas. JavaScript admite JSON y las cadenas compatibles con JSON se pueden convertir en objetos JavaScript mediante la función de evaluación de JavaScript. Sin embargo, si una cadena de JavaScript representa el estado de un objeto personalizado, el desarrollador debe asegurarse de que se defina una clase correspondiente.

La pila de red AJAX es responsable de crear la cadena JSON para cada objeto pasado remotamente. En el lado del servidor, los datos se reciben a través de una clase de formateador especializado y se transmiten. NET para completar la clase administrada coincidente. Al regresar, la clase administrada .NET se serializa en una cadena JSON y se envía al cliente. El administrador de scripts se asegurará de que las clases (clases de proxy de servicio web) que hacen referencia a estas cadenas JSON existan en el lado del cliente.

El siguiente es un ejemplo de formato JSON que describe el estado de un objeto:

{"ID":"ALFKI", "Company":"Alfred Futterkiste"}

Esta cadena indica que el objeto tiene dos atributos: ID y Empresa, que almacenan valores serializados en forma de cadenas. Si a una propiedad se le asigna un valor de un tipo no básico (como un objeto personalizado), el valor se serializa recursivamente a JSON.[

JSON es similar a XML

es más refinado que XML y JSON y más adecuado para el lenguaje JavaScript.

Servicios web específicos de la aplicación

De forma predeterminada, los servicios web envían y reciben paquetes de datos SOAP (en lugar de paquetes de datos JSON) a través del lenguaje de descripción de servicios web (lenguaje de descripción de servicios web, WSDL) documento para exponer su contrato. ¿Cómo funcionan los servicios web XML en el contexto de una aplicación AJAX?

El controlador HTTP que recibe solicitudes asmx se puede modificar a través del archivo web.config de la aplicación AJAX para redirigir estas llamadas a un controlador HTTP que comprenda la secuencia JSON. Esto significa que un servicio web XML puede ser un servicio dual, aceptando y procesando solicitudes SOAP así como solicitudes JSON. En el nivel de configuración, podemos desactivar la compatibilidad con SOAP y ocultar el archivo WSDL utilizado para exponer las capacidades del servicio al mundo exterior.

Si desea utilizar un servicio web habilitado para JSON, debe eliminar el XML, porque al llamar al servicio web, no procesamos SOAP y los servicios web XML para aplicaciones AJAX no utilizan SOAP. mensajes.

Definición de interfaz de programación remota

El contrato se utiliza para definir lo que el punto final del lado del servidor expone a la persona que llama. Si desea implementarlo como un servicio web, no es estrictamente necesario que exista un contrato real. Pero si está sirviendo WCF en 3.5, entonces el contrato debe existir. Con todo, una API pública diseñada en forma de interfaz hará que el código sea más limpio. Una vez creada la clase que implementa la interfaz, el trabajo en la interfaz API del servidor finaliza. De esta manera podemos publicar esta API remota y dejar que el tiempo de ejecución de AJAX administre las llamadas desde el cliente.

Para los servicios web, definimos el contrato a través de una interfaz pura, de modo que la interfaz contiene métodos y propiedades relacionados con la API del servidor. A continuación se proporciona un servicio simple:

usando System; interfaz pública ITimeService{

DateTime GetTime();

string GetTimeFormat(formato de cadena);}< / p>

Estos dos métodos constituyen la API del servidor que se puede llamar en el cliente.

Implementar la interfaz acordada

Los servicios web generalmente se derivan de la clase base WebService. NET para implementar:

usando System.Web.Services; clase pública TimeService: WebService, ITimeService{

}

Tenga en cuenta que no es necesario iniciar desde la base Derivada de la clase WebService, esta clase base se utiliza principalmente para acceder directamente a algunos objetos de uso común (como Aplicación y Sesión). Si no necesita acceso directo a estos objetos internos, puede crear un servicio web sin derivarlo de la clase WebService. En este caso, podemos usar el objeto interno indirectamente a través del objeto HttpContext.

Publicación de protocolos

Esencialmente, publicar un protocolo de servidor determinado consiste en generar una clase de proxy JavaScript que puede ser invocada mediante scripts incrustados en la página. Si la API del servidor se implementa a través de un servicio web, debemos registrar el servicio web con el administrador de scripts de la página AJAX.

Además, agregaremos un controlador HTTP de solicitud asmx especial en el archivo web.config.

Llamada remota de servicios web

Los servicios web proporcionan un entorno de alojamiento para que se llame al código del lado del servidor en respuesta a las operaciones del cliente. Los métodos web en los servicios apuntan al código específico de la aplicación.

Creación de Servicios Web AJAX

Los servicios web personalizados para aplicaciones AJAX son más pequeños que otros servicios web. Existen dos diferencias entre los servicios web AJAX y los servicios web XML tradicionales.

En primer lugar, si utiliza servicios web AJAX, para satisfacer las necesidades de una aplicación específica, necesitamos diseñar el contrato del servicio web AJAX, en lugar de configurar el comportamiento del servicio público. La aplicación de destino es el host del servicio web. En segundo lugar, debemos utilizar un nuevo atributo para declarar la clase de este servicio web, lo cual no está permitido en los servicios web XML normales.

El efecto final es que el servicio web AJAX puede tener dos conjuntos de interfaces públicas: una se basa en la interfaz JSON, utilizada por la aplicación AJAX host, la otra se basa en la interfaz SOAP, expuesta a; Para el cliente, cualquier plataforma puede acceder a la URL del servicio.

Atributo ScriptService (atributo)

Para crear un servicio web AJAX, el primer paso es establecer un proyecto de servicio web estándar. y luego importe el espacio de nombres System.Web.Script.Services:

usando System.Web.Script.Services;namespace Core35.WebService{

[WebService(Namespace="

[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]

[ScriptService]

clase pública TimeService: System.Web.Services.WebService, ITimeService

{

}}

El atributo ScriptService es la clave para marcar la diferencia entre los servicios web XML y los servicios web AJAX. Este atributo establece que el servicio está diseñado para aceptar solicitudes de. Llamada de proxy de cliente basada en JavaScript.

Bloqueo del cliente SOAP

Una vez creado el servicio web AJAX, podrá publicarse como un recurso ASMX. De forma predeterminada, tendrá un carácter público. La URL puede ser invocada por clientes AJAX y también puede ser descubierta y utilizada por clientes y herramientas SOAP. Para hacer esto, simplemente agregue la siguiente configuración en el archivo web.config:

webSevices

<. p>protocols

clear /

/protocols/webServices

Esta configuración simple deshabilita todos los protocolos de definiciones de servicios web (incluido SOAP) para que el servicio solo pueda responder a solicitudes JSON.

Tenga en cuenta que si agrega estas configuraciones, no podrá llamar al servicio web a través de la barra de direcciones del navegador, por lo que simplemente puede probarlo así. Por lo tanto, no podemos agregar el. sufijo wsdl en la URL para llamar a WSDL.

Definición de métodos de servicio web

La página del cliente puede llamar al método público * con el atributo WebMethod en el método ** de clase de servicio web. De forma predeterminada, estos métodos se llaman mediante la acción HTTP POST y devuelven sus valores como objetos JSON. Podemos cambiar la configuración predeterminada de un método individual a través de una función opcional ScriptMethod.

El atributo ScriptMethod tiene 3 atributos, consulte la siguiente tabla:

Debido a problemas de seguridad y rendimiento, utilice el atributo ScriptMethod con precaución. El siguiente código utiliza este atributo, pero no lo hace. Modifique la configuración predeterminada:

[WebMethod][ScriptMethod]public DateTime GetTime(){

}

El atributo WebMethod es obligatorio y el atributo ScriptMethod es Elegido opcional.

Registro de servicios Web AJAX

Para iniciar una llamada al servicio Web en el cliente, sólo necesitamos el XMLHttpRequest, la URL del servicio Web de destino y la función de gestión. de la secuencia JSON. Para mayor comodidad, toda la funcionalidad está incluida en una clase de proxy JavaScript que se asigna a la interfaz de programación remota. La clase de proxy será generada automáticamente por el marco AJAX y se inyectará en el cliente.

Para que el motor integrado genere el proxy JavaScript y las clases auxiliares necesarias, debemos registrar el servicio web con el control Script Manager en la página que requiere el servicio web AJAX:

asp:ScriptManager ID="ScriptManager1" runat="servidor"

Servicios

asp:ServiceReference Path="~/WebServices/TimeService.asmx" /

/Services/asp:ScriptManager

Para que cada servicio web se vincule a la página, agregamos una etiqueta ServiceReference y configuramos el atributo Path en la URL del recurso asmx correspondiente para cada referencia de servicio. , generaremos automáticamente un bloque de script adicional en el lado del cliente. La URL del script apunta a un controlador HTTP del sistema, que internamente llama a la siguiente URL:

~/WebServices/TimeService.asmx/js

El sufijo /js agregado a la URL del servicio web indica La biblioteca de tiempo de ejecución AJAX genera clases de proxy JavaScript para servicios web específicos. Si la página está en la plantilla de depuración, el sufijo se cambiará a /jsdebug.

De forma predeterminada, el agente JavaScript está conectado a la página a través de la etiqueta script, por lo que debe descargarse por separado. También podemos incorporar cualquier script que deseemos en la página actual estableciendo la propiedad InlineScript del objeto ServiceReference en verdadero. Si el almacenamiento en caché del navegador está habilitado y varias páginas web utilizan la misma referencia de servicio, el valor predeterminado falso es más apropiado. En este caso, no importa cuántas páginas requieran esta clase de proxy, solo se requiere una solicitud. Establecer la propiedad InlineScript en verdadero reducirá la cantidad de solicitudes de red, pero ocupará una cierta cantidad de ancho de banda adicional.

Si registramos el servicio web AJAX mediante programación, utilizamos un código similar al siguiente:

ServiceReference service = new ServiceReference(); service.Path = "~/WebServices/TimeService.asmx ";ScriptManager1.Services.Add(service);

No importa qué método se utilice, para llamar al servicio web, solo necesitamos iniciar la llamada a través de la clase de proxy JavaScript.

Usar aplicaciones para alojar servicios web AJAX

Para habilitar llamadas a servicios web en aplicaciones AJAX, necesitamos agregar el siguiente contenido en el archivo web.config para registrar una solicitud HTTP asmx especial controlador:

En la devolución de llamada completada, primero restablecemos la interfaz de usuario y luego realizamos otras operaciones:

método de funciónCompletedWithFeedback(resultados, contexto, nombre del método){

$get("Comentarios"). InnerHTML = "";

}

Tenga en cuenta que también limpiamos la interfaz de usuario cuando ocurre un error.

Procesamiento de tiempo de espera

Si se inicia una llamada de cliente al servicio web asmx, es una llamada directa a asmx. Para esta solicitud, solo hay un controlador de sincronización en el tiempo de ejecución. En otras palabras, no importa cómo el cliente detecte si la llamada actual está en progreso, el hilo quedará completamente bloqueado hasta que se ejecute el método AJAX. Para hacer esto, podemos configurar el tiempo de espera:

Core35.WebServices.MySampleService.set_timeout(3000);

El atributo de tiempo de espera es global y afecta a todos los métodos de la clase proxy.

Si la solicitud caduca, no recibiremos respuesta del servidor, y el cliente sólo podrá cancelar unilateralmente la ejecución.