Compartir a través de


Get y Put condicionales

En este ejemplo se muestra cómo utilizar las nuevas API de recuperación y actualización condicionales para el modelo de programación REST de WCF. Dado que la recuperación y actualización condicionales son muy adecuadas para los servicios REST y orientado a recursos, este ejemplo amplía el ejemplo de Servicio de recurso básico. Este ejemplo se centra en cómo agregar compatibilidad con la recuperación y actualización condicionales al ejemplo Servicio de recurso básico utilizando las nuevas API incluidas en .NET Framework versión 4.

Demostraciones

Recuperación y actualización condicionales

Análisis

El servicio WCF de este ejemplo expone una colección de clientes al estilo de REST y orientado a recursos. Para obtener una descripción detallada de la implementación del servicio, vea el ejemplo Servicio de recurso básico.

Este ejemplo agrega funciones de recuperación y actualización condicionales al ejemplo Servicio de recurso básico. La recuperación y actualización condicionales usan etiquetas de entidad HTTP y encabezados If-None-Match e If-Match HTTP para validar si los clientes tienen o no la entidad más actual para un recurso dado. Sin embargo, implementar el código para analizar correctamente los encabezados If-None-Match e If-Match de HTTP puede ser tedioso y se suelen cometer muchos errores. Por consiguiente, los métodos CheckConditionalUpdate y CheckConditionalRetrieve se han agregado a IncomingWebRequestContext, al que se puede tener acceso utilizando la instancia actual de WebOperationContext. Además, el método SetETag se ha agregado a OutgoingWebRequestContext, con lo que se facilita devolver las etiquetas de entidad válidas.

El método CheckConditionalRetrieve está pensado para ser utilizado con operaciones [WebGet]. Toma la etiqueta de entidad actual para el recurso dado como el parámetro entityTag, que puede ser de tipo string, int, long o Guid. El método CheckConditionalRetrieve comprueba la etiqueta de entidad con respecto al encabezadoIf-None-Match de HTTP de la solicitud. Si la etiqueta de entidad se encuentra en el encabezado If-None-Match de HTTP, se inicia un WebFaultException con el código de estado No modificado (304); de lo contrario, el método vuelve. El mecanismo de recuperación condicional permite al cliente indicar al servidor que tiene esta entidad y enviar solo la entidad actual, si el cliente aún no la tiene. Un uso de ejemplo del método CheckConditionalRetrieve se puede ver en las operaciones GetCustomers y GetCustomer del servicio. Es importante tener en cuenta que las llamadas a CheckConditionalRetrieve pueden no volver. Los desarrolladores de software deberían implementar la operación de modo que ya se sepa que la solicitud es correcta antes de ejecutar la llamada al método CheckConditionalRetrieve, de modo que si la llamada al método CheckConditionalRetrieve no se realizara, el servicio enviaría una respuesta con un código de estado correcto.

El método CheckConditionalUpdate es similar al método CheckConditionalRetrieve. También acepta la etiqueta de entidad actual para el recurso dado. Sin embargo, está destinado a ser utilizado con operaciones [WebInvoke] en las que el método se establece en "PUT" o "DELETE". El método CheckConditionalUpdate comprueba la etiqueta de entidad con respecto al encabezado If-Match de HTTP de la solicitud. Si la etiqueta de entidad no se encuentra en el encabezado If-Match de HTTP, se genera una WebFaultException con un código de estado de error en la condición previa (412). El mecanismo de actualización condicional permite al cliente indicar al servidor que tiene esta entidad para el recurso y permitir que únicamente el cliente modifique el recurso; si la entidad que tiene es actual. Un uso de ejemplo del método CheckConditionalUpdate se puede ver en las operaciones DeleteCustomer y UpdateCustomer del servicio. Así como con CheckConditionalRetrieve, es importante tener en cuenta que las llamadas a CheckConditionalUpdate pueden no volver. Los desarrolladores de software deberían implementar tal operación de modo que ya se sepa que la solicitud es correcta antes de ejecutar la llamada al método CheckConditionalUpdate, de modo que si la llamada al método CheckConditionalUpdate no se realizara, el servicio respondería con un código de estado correcto.

El ejemplo consta de un servicio autohospedado y un cliente que se ejecuta dentro de una aplicación de consola. A medida que se ejecuta la aplicación de consola, el cliente realiza solicitudes al servicio y escribe la información pertinente de las respuestas en la ventana de la consola.

Para ejecutar el ejemplo

  1. Abra la solución del ejemplo de Get y Put condicionales. Al iniciar Visual Studio 2010, debe ejecutarlo como administrador para ejecutar el ejemplo correctamente. Para ello, haga clic con el botón secundario en el icono de Visual Studio 2010 y elija Ejecutar como administrador en el menú contextual.

  2. Presione F6 para compilar la solución y, a continuación, presione CTRL+F5 para ejecutar el proyecto de la aplicación de consola. Si este proyecto se ejecuta con la depuración habilitada (al presionar F5 en lugar de CTRL+F5), el depurador se detiene cuando se genera una excepción al comprobar las operaciones GET y PUT condicionales. Si sucede esto, presione F5 para seguir ejecutando el ejemplo.

  3. La ventana de la consola aparece y proporciona el URI del servicio en ejecución y el URI de la página de Ayuda HTML para este.

  4. A medida que se ejecute el ejemplo, el cliente envía las solicitudes al servicio y escribe las respuestas en la ventana de la consola.

  5. Presione cualquier tecla para terminar el ejemplo.

Ee818665.Important(es-es,VS.100).gif Nota:
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.

<InstallDrive>:\WF_WCF_Samples

Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de WF y Windows Communication Foundation (WCF). Este ejemplo se encuentra en el siguiente directorio.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Web\ConditionalGetAndPut