Compartir a través de


Introducción al modelo de programación HTTP web de WCF

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

  • URIs y procesamiento de URIs Los URIs desempeñan un papel central en el diseño de servicios HTTP web. El modelo de programación HTTP WEB de WCF usa las clases UriTemplate y UriTemplateTable para proporcionar funcionalidades de procesamiento de URI.

  • soporte para operaciones GET y POST los servicios web HTTP utilizan el método GET para la recuperación de datos, además de varios métodos invocativos para la modificación de datos e invocación remota. El modelo de programación HTTP WEB de WCF usa el WebGetAttribute y WebInvokeAttribute para asociar operaciones de servicio con los verbos GET y otros verbos HTTP, como PUT, POST y DELETE.

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

El modelo de programación HTTP WEB de WCF amplía el alcance de WCF para cubrir escenarios de estilo web que incluyen servicios HTTP WEB, servicios AJAX y JSON y fuentes de distribución (ATOM/RSS). Para obtener más información sobre los servicios AJAX y JSON, consulte integración de AJAX y compatibilidad con JSON. Para obtener más información sobre la redifusión, consulte Información general de redifusión de WCF.

No hay restricciones adicionales sobre los tipos de datos que se pueden devolver desde un servicio HTTP WEB. Cualquier tipo serializable se puede devolver a partir de una operación de servicio WEB HTTP de WCF. Dado que un explorador web puede invocar las operaciones del servicio HTTP web, hay una limitación en qué tipos de datos se pueden especificar en una dirección URL. Para obtener más información sobre qué tipos son compatibles de forma predeterminada, consulte la sección UriTemplate Query String Parameters and URLs a continuación. El comportamiento predeterminado se puede cambiar proporcionando su propia implementación T:System.ServiceModel.Dispatcher.QueryStringConverter, que especifica cómo convertir los parámetros especificados en una dirección URL al tipo de parámetro real. Para obtener más información, consulte QueryStringConverter

Cautela

Los servicios escritos con el modelo de programación HTTP WEB de WCF no usan mensajes SOAP. Dado que no se usa SOAP, no se pueden usar las características de seguridad proporcionadas por WCF. Sin embargo, puede usar la seguridad basada en transporte hospedando el servicio con HTTPS. Para obtener más información sobre la seguridad de WCF, vea Security Overview.

Advertencia

La instalación de la extensión WebDAV para IIS puede provocar que los servicios HTTP web devuelvan un error HTTP 405, ya que la extensión WebDAV intenta controlar todas las solicitudes PUT. Para solucionar este problema, puede desinstalar la extensión WebDAV o deshabilitar la extensión WebDAV para su sitio web. Para obtener más información, vea IIS y WebDav.

Procesamiento de URI con UriTemplate y UriTemplateTable

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

Esta plantilla describe los URI como los siguientes:

  • a/x/c

  • a/y/c

  • a/z/c

  • y así sucesivamente.

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 le permiten 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 de la plantilla de URI se reemplazan por valores reales.

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

  • Bind() y Match() son inversas para que pueda llamar a Match( Bind( x ) ) y regresar al mismo entorno con el que comenzó.

Hay muchas ocasiones (especialmente en el servidor, donde es necesario enviar una solicitud a una operación de servicio basada en el URI) en las que puede querer realizar un seguimiento de un conjunto de objetos UriTemplate en una estructura de datos que pueda acceder de forma independiente a cada una de las plantillas contenidas. UriTemplateTable representa un conjunto de plantillas de URI y selecciona la mejor coincidencia dada una serie de plantillas y un URI candidato. Esto no está afiliado a ninguna pila de red determinada (WCF incluida) para que pueda usarla siempre que sea necesario.

El modelo de servicio WCF usa UriTemplate y UriTemplateTable para asociar operaciones de servicio a un conjunto de URI descritos por un 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, vea UriTemplate y UriTemplateTable.

Atributos WebGet y WebInvoke

Los servicios HTTP WEB de WCF usan 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 HTTP WEB de WCF permite a los desarrolladores de servicios controlar tanto la plantilla de URI como el verbo asociados a sus operaciones de servicio con el WebGetAttribute y WebInvokeAttribute. El WebGetAttribute y el WebInvokeAttribute permiten controlar cómo las operaciones individuales se enlazan a los URI y los métodos HTTP asociados a esos URI. Por ejemplo, agregue WebGetAttribute y WebInvokeAttribute en el código siguiente.

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

  [WebGet]
  Customer GetCustomer():

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

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

GET /GetCustomer

POST /UpdateCustomerName

El valor predeterminado de WebInvokeAttribute es POST, pero también puede utilizarse 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 obtener un ejemplo completo de un servicio WCF que usa el modelo de programación HTTP WEB de WCF, vea How to: Create a Basic WCF Web HTTP Service.

Parámetros de cadena de consulta y URLs de UriTemplate

Los servicios de estilo web se pueden llamar desde un explorador web escribiendo una dirección URL asociada a una operación de servicio. Estas operaciones de servicio pueden tomar parámetros de cadena de consulta que se deben especificar en forma de cadena dentro de la dirección URL. En la tabla siguiente se muestran los tipos que se pueden pasar dentro de una dirección URL y el formato usado.

Tipo Formato
Byte 0 - 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 notación exponente)
Double -1.79769313486232e308 - 1.79769313486232e308 (no se requiere notación exponencial)
Char Cualquier carácter único
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 (la cadena nula no se admite y no se realiza ningún escape)
DateTime MM/DD/AAAA

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

Mes día año

Día Mes Año HH:MM:SS [a. m.|p. m.]
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. Depende del convertidor de tipos.

Formatos y el modelo de programación HTTP WEB de WCF

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

  • XML
  • JSON
  • Secuencias binarias opacas

Esto significa que el modelo de programación WEB HTTP de WCF puede manejar cualquier tipo de datos, pero es posible que esté programando en contra de Stream.

.NET Framework 3.5 proporciona compatibilidad con datos JSON (AJAX), así como fuentes de distribución (incluidos ATOM y RSS). Para obtener más información sobre estas características, consulte Formato HTTP Web de WCF, Introducción a la Distribución de WCFy Integración de AJAX y Compatibilidad con JSON.

Modelo de programación HTTP web de WCF y seguridad

Dado que el modelo de programación HTTP WEB de WCF no admite los protocolos WS-*, la única manera de proteger un servicio WEB HTTP de WCF es 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 Implementación de SSL en IIS.

Solución de problemas del modelo de programación HTTP web de WCF

Al llamar a los servicios WEB HTTP de WCF mediante un ChannelFactoryBase<TChannel> para crear un canal, el WebHttpBehavior usa el EndpointAddress establecido en el archivo de configuración incluso si se pasa un EndpointAddress diferente al ChannelFactoryBase<TChannel>.

Consulte también