Procedimiento para elegir entre solicitudes HTTP POST y HTTP GET para puntos de conexión AJAX de ASP.NET
Windows Communication Foundation (WCF) le permite crear un servicio que hace que esté disponible un punto de conexión habilitado para AJAX de ASP.NET al que se puede llamar desde JavaScript en un sitio web cliente. Los procedimientos básicos para crear tales servicios se discuten en Uso de la configuración para agregar un punto de conexión AJAX de ASP.NET y Procedimiento para agregar un punto de conexión AJAX de ASP.NET sin usar la configuración.
AJAX de ASP.NET admite operaciones que utilizan verbos HTTP POST y HTTP GET, donde HTTP POST es el valor predeterminado. Si crea una operación que no tiene efectos secundarios y devuelve datos que raramente o nunca cambian, utilice HTTP GET en su lugar. Los resultados de operaciones GET pueden almacenarse en memoria caché, lo que significa que varias llamadas a la misma operación solo pueden producir una solicitud a su servicio. WCF no realiza el almacenamiento en caché, pero puede tener lugar en cualquier nivel (en el explorador de un usuario, en un servidor proxy y en otros niveles). El almacenamiento en caché es ventajoso si desea aumentar el rendimiento del servicio, pero es posible que no sea aceptable si los datos cambian con frecuencia o si la operación realiza alguna acción.
Por ejemplo, si está diseñando un servicio para administrar la biblioteca de música de un usuario, una operación que busca al artista basándose en el título del álbum, se beneficia del uso de GET, pero una operación que agrega un álbum a la colección personal del usuario debe utilizar POST.
Para controlar la duración de la caché, utilice el tipo OutgoingWebResponseContext. Por ejemplo, al diseñar un servicio que devuelve los boletines de previsión meteorológica actualizados cada hora, utilizaría GET pero limitar la duración del almacenamiento en caché a una hora o menos para evitar que los usuarios del servicio tengan acceso a datos obsoletos.
Al utilizar los servicios en una página AJAX de ASP.NET que utiliza el control del administrador de scripts, no hay diferencia si la operación usa GET o POST, el mecanismo del administrador de scripts se asegurara de que se emita el tipo de petición correcto.
Las operaciones GET y HTTP utilizan cualquier parámetro de entrada admitido por operaciones POST, incluso los datos complejos como los tipos de contrato. Sin embargo, en la mayoría de los casos se recomienda evitar demasiados parámetros o parámetros que son demasiado complejos en operaciones GET, porque se reduce la eficacia de almacenamiento en caché.
En este tema se muestra cómo elegir entre GET y POST agregando atributos WebGetAttribute o WebInvokeAttribute a las operaciones pertinentes en el contrato de servicios. Los otros pasos (implementar, configurar y hospedar el servicio) que se requieren para poner en marcha el servicio son similares a aquellos utilizados con el servicio de AJAX de ASP.NET en WCF.
Una operación marcada con WebGetAttribute siempre usa una solicitud GET. Una operación marcada con WebInvokeAttribute o no marcada con ninguno de los dos atributos, usa una solicitud POST. WebInvokeAttribute permite el uso de otros verbos HTTP, distintos de GET y POST (como PUT y DELETE) mediante la propiedad Method. AJAX de ASP.NET no admite, sin embargo, estos verbos. Si piensa utilizar el servicio desde páginas ASP.NET utilizando el control del administrador de scripts, no utilice la propiedad Method.
Para un ejemplo práctico del cambio a GET, consulte el ejemplo Servicio AJAX básico.
Para un ejemplo que utiliza POST, consulte el ejemplo Servicio AJAX mediante HTTP POST.
Creación de un servicio WCF que responda a solicitudes HTTP GET o HTTP POST
Defina un contrato de servicio WCF básico con una interfaz marcada con el atributo ServiceContractAttribute. Marque cada operación con el OperationContractAttribute. Agregue el atributo WebGetAttribute para estipular que una operación debería responder a las solicitudes HTTP GET. También puede agregar el atributo WebInvokeAttribute para especificar explícitamente HTTP POST o no especificar un atributo, que tiene como valor predeterminado HTTP POST.
[ServiceContract] public interface IMusicService { //This operation uses a GET method. [OperationContract] [WebGet] string LookUpArtist(string album); //This operation will use a POST method. [OperationContract] [WebInvoke] void AddAlbum(string user, string album); //This operation will use POST method by default //since nothing else is explicitly specified. [OperationContract] string[] GetAlbums(string user); //Other operations omitted… }
Implemente el contrato de servicios
IMusicService
con unMusicService
.public class MusicService : IMusicService { public void AddAlbum(string user, string album) { //Add implementation here. } //Other operations omitted… }
Cree un nuevo archivo denominado servicio con una extensión .svc en la aplicación. Puede modificar este archivo si agrega la información de directiva @ServiceHost adecuada para el servicio. Especifique que el WebScriptServiceHostFactory debe utilizarse en la directiva @ServiceHost para configurar automáticamente un punto de conexión AJAX ASP.NET.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.Ajax.Samples.MusicService" Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory %>
Realización de llamadas al servicio
Puede probar las operaciones GET de su servicio sin código de cliente, utilizando el examinador. Por ejemplo, si el servicio se configura en la dirección
http://example.com/service.svc
, si se escribehttp://example.com/service.svc/LookUpArtist?album=SomeAlbum
en la barra de direcciones del explorador se invoca al servicio y la respuesta se muestra o se descarga.Puede utilizar los servicios con operaciones GET de la misma manera que cualquier otro servicio de AJAX de ASP.NET: escribiendo la URL de servicio en la colección Scripts del control del administrador de scripts de AJAX de ASP.NET. Para un ejemplo, consulte el Servicio AJAX básico.