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
() yMatch
() son inversos para que pueda llamarMatch
(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>.