Información general del modelo de programación web HTTP de WCF

El modelo de programación WEB HTTP de Windows Communication Foundation (WCF) proporciona los elementos básicos que son necesarios para compilar servicios WEB HTTP con WCF. Los servicios WEB HTTP de WC están diseñados para que la gama más amplia de clientes posible tenga acceso a ellos, incluidos los exploradores web, y tienen los requisitos únicos siguientes:

  • URI y procesamiento de URI: los URI juegan un papel central en el diseño de servicios WEB HTTP. El modelo de programación WEB HTTP de WCF usa las clases UriTemplate y UriTemplateTable para proporcionar las funciones de procesamiento de URI.

  • Compatibilidad para las operaciones GET y POST: los servicios WEB HTTP usan el verbo GET para la recuperación de datos, además de varios verbos de invocación para la modificación de datos y la invocación remota. El modelo de programación WEB HTTP de WCF usa los atributos WebGetAttribute y WebInvokeAttribute para asociar las operaciones de servicio con el verbo GET y otros verbos HTTP, como PUT, POST y DELETE.

  • Varios formatos de datos: los servicios de tipo web procesan muchos tipos de datos además de los mensajes SOAP. El modelo de programación WEB HTTP de WCF usa WebHttpBinding y WebHttpBehavior para admitir muchos formatos de datos diferentes incluyendo documentos XML, objeto de datos de JSON y secuencias de contenido binario como imágenes, archivos de vídeo o texto sin formato.

El modelo de programación WEB HTTP de WCF extiende el alcance de WCF para abarcar escenarios de tipo web que incluyen los servicios WEB HTTP, AJAX y JSON, así como las fuentes de redifusión (ATOM/RSS). Para obtener más información sobre los servicios AJAX y JSON, consulte Integración de AJAX y compatibilidad de JSON. Para obtener más información sobre la redifusión, consulte Información general de redifusión de WCF.

No existen restricciones adicionales en los tipos de datos que puedan devolverse desde un servicio WEB HTTP. Cualquier tipo serializable se puede devolver a partir de una operación de servicio WEB HTTP de WCF. Puesto que estas operaciones de servicio WEB HTTP las puede invocar un explorador web existe un límite en los tipos de datos que se pueden especificar en una dirección URL. Para obtener más información sobre los tipos admitidos de forma predeterminada, consulte la sección Parámetros de cadena de consulta y direcciones URL de UriTemplate a continuación. El comportamiento predeterminado se puede cambiar proporcionando su propia implementación de la clase T:System.ServiceModel.Dispatcher.QueryStringConverter que especifica cómo convertir los parámetros especificados de una dirección URL en el tipo de parámetro real. Para obtener más información, vea QueryStringConverter.

Precaución

Los servicios escritos mediante el modelo de programación WEB HTTP de WCF no usan mensajes SOAP. Por este motivo, no se podrán usar las características de seguridad proporcionadas por WCF. Sin embargo, puede usar la seguridad basada en el transporte hospedando el servicio con HTTPS. Para obtener más información sobre la seguridad de WCF, consulte Información general sobre seguridad.

Advertencia

Si se instala la extensión WebDAV para IIS, se puede provocar que los servicios web HTTP devuelvan un error 405 HTTP cuando la extensión WebDAV intente administrar todas las solicitudes PUT. Para evitar este problema puede desinstalar la extensión WebDAV o deshabilitarla para su sitio web. Para obtener más información, consulte el artículo sobre IIS y WebDav.

Procesamiento de URI con UriTemplate y UriTemplateTable

Las plantillas URI proporcionan una sintaxis eficaz para expresar grandes conjuntos de URI similares estructuralmente. Por ejemplo, la siguiente plantilla expresa el conjunto de todos los URI de tres segmentos que comienzan en "a" y acaban en "c" sin tener en cuenta el valor del segmento intermedio: a/{segmento}/c

Esta plantilla describe los URI de la siguiente manera:

  • a/x/c

  • a/y/c

  • a/z/c

  • etcétera.

En esta plantilla, la notación de la llave (" {segmento}") indica un segmento variable en lugar de un valor literal.

.NET Framework proporciona una API para trabajar con plantillas de URI denominadas UriTemplate. UriTemplates permite hacer lo siguiente:

  • Puede llamar a uno de los métodos Bind con un conjunto de parámetros para generar un URI totalmente cerrado que coincide con la plantilla. Esto significa que todas las variables dentro de la plantilla URI se reemplaza con valores reales.

  • Puede llamar Match() con un URI candidato, que utiliza una plantilla para dividir un URI candidato en sus partes constituyentes y devuelve un diccionario que contiene las partes diferentes del URI etiquetadas según las variables de la plantilla.

  • Bind() y Match() son inversos para que pueda llamar Match( Bind(x)) y vuelven con el mismo entorno con el que comenzó.

Hay muchas veces (sobre todo en el servidor, donde es necesario enviar una solicitud a una operación de servicio basada en el URI) que desea realizar el seguimiento de un conjunto de objetos UriTemplate en una estructura de datos que se puede direccionar independientemente de cada una de las plantillas contenidas. UriTemplateTable representa un conjunto de plantillas de URI y selecciona la mejor coincidencia dado un conjunto de plantillas y un URI candidato. Esto no está asociado a ninguna pila de conexión en red determinada (incluido WCF) por lo que puede utilizarlo dondequiera que sea necesario.

El modelo de servicio WCF hace uso de UriTemplate y UriTemplateTable para asociar las operaciones del servicio a un conjunto de URI descrito mediante una UriTemplate. Una operación de servicio está asociada a una UriTemplate, utilizando WebGetAttribute o WebInvokeAttribute. Para obtener más información sobre UriTemplate y UriTemplateTable, consulte UriTemplate y UriTemplateTable.

Atributos WebGet y WebInvoke

Los servicios WEB HTTP de WCF hacen uso de verbos de recuperación (por ejemplo, HTTP GET), además de varios verbos de invocación (por ejemplo, HTTP POST, PUT y DELETE). El modelo de programación WEB HTTP de WCF permite a los desarrolladores de servicios controlar la plantilla URI y el verbo asociado con sus operaciones de servicio con WebGetAttribute y WebInvokeAttribute. WebGetAttribute y WebInvokeAttribute le permiten controlar cómo las operaciones individuales se enlazan a los URI y los métodos HTTP asociados a esos URI. Por ejemplo, agregando en el siguiente código, WebGetAttribute y WebInvokeAttribute.

[ServiceContract]
interface ICustomer
{
  //"View It"

  [WebGet]
  Customer GetCustomer():

  //"Do It"
    [WebInvoke]
  Customer UpdateCustomerName( string id,
                               string newName );
}

El código anterior le permite realizar las solicitudes HTTP siguientes.

GET /GetCustomer

POST /UpdateCustomerName

WebInvokeAttribute establece como valor predeterminado POST pero también puede utilizarlo para otros verbos.

[ServiceContract]
interface ICustomer
{
  //"View It" -> HTTP GET
    [WebGet( UriTemplate="customers/{id}" )]
  Customer GetCustomer( string id ):

  //"Do It" -> HTTP PUT
  [WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

Para ver un ejemplo completo de un servicio WCF que usa el modelo de programación WEB HTTP de WCF, consulte Procedimiento para crear un servicio básico web HTTP de WCF.

Parámetros de cadena de consulta y direcciones URL de UriTemplate

Se puede llamar a los servicios de tipo web desde un explorador web escribiendo una URL que está asociada a una operación del servicio. Estas operaciones del servicio pueden tomar parámetros de cadena de consulta que se deben especificar en forma de cadena dentro de la dirección URL. La siguiente tabla muestra los tipos que se pueden pasar dentro de una dirección URL y el formato utilizado.

Tipo Formato
Byte De 0 a 255
SByte -128 - 127
Int16 -32768 - 32767
Int32 -2,147,483,648 - 2,147,483,647
Int64 -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807
UInt16 0 - 65535
UInt32 0 - 4,294,967,295
UInt64 0 - 18,446,744,073,709,551,615
Single -3.402823e38 - 3.402823e38 (no se requiere la notación exponencial)
Double -1.79769313486232e308 - 1.79769313486232e308 (no se requiere la notación exponencial)
Char Un carácter cualquiera
Decimal Cualquier decimal en notación estándar (sin exponente)
Boolean True o False (sin distinción entre mayúsculas y minúsculas)
String Cualquier cadena (no se admite la cadena nula y no se utilizan caracteres de escape)
DateTime MM/DD/YYYY

MM/DD/YYYY HH:MM:SS [AM|PM]

Mes día año

Mes día año HH:MM:SS [AM|PM]
TimeSpan DD.HH:MM:SS

Donde DD = Días, HH = Horas, MM = minutos, SS = Segundos
Guid Un GUID, por ejemplo:

936DA01F-9ABD-4d9d-80C7-02AF85C822A8
DateTimeOffset MM/DD/YYYY HH:MM:SS MM:SS

Donde DD = Días, HH = Horas, MM = minutos, SS = Segundos
Enumeraciones El valor de enumeración, por ejemplo, que define la enumeración como se muestra en el código siguiente.

public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

Cualquiera de los valores de enumeración individuales (o sus valores enteros correspondientes) se puede especificar en la cadena de consulta.
Tipos que tienen TypeConverterAttribute que puede convertir el tipo en una representación de cadena y viceversa. Según el convertidor de tipos.

Los formatos y el modelo de programación WEB HTTP de WCF

El modelo de programación WEB HTTP de WCF tiene nuevas características que funcionan con muchos formatos de datos diferentes. En la capa de enlace, WebHttpBinding puede leer y escribir los siguientes tipos diferentes de datos:

  • XML

  • JSON

  • Secuencias binarias opacas

Esto significa que el modelo de programación WEB HTTP de WCF puede administrar cualquier tipo de datos, pero puede estar programando con Stream.

.NET Framework 3.5 proporciona compatibilidad con datos JSON (AJAX) y las fuentes de redifusión (incluidas ATOM y RSS). Para obtener más información sobre estas características, consulte Formato HTTP web de WCF, Información general de redifusión de WCF e Integración de AJAX y compatibilidad de JSON.

El modelo de programación WEB HTTP de WCF y la seguridad

Dado que el modelo de programación WEB HTTP de WCF no admite los protocolos WS-*, la única manera de proteger un servicio WEB HTTP de WCF consiste en exponer el servicio a través de HTTPS mediante SSL. Para obtener más información sobre cómo configurar SSL con IIS 7.0, consulte el artículo sobre cómo implementar SSL en IIS.

Solución de problemas relacionados con el modelo de programación WEB HTTP de WCF

Al llamar a los servicios WEB HTTP de WCF mediante un objeto ChannelFactoryBase<TChannel> para crear un canal, WebHttpBehavior usa la clase EndpointAddress establecida en el archivo de configuración, aunque se pase una EndpointAddress diferente al ChannelFactoryBase<TChannel>.

Consulte también