Visão geral de modelo de programação HTTP Web do WCF

O modelo de programação HTTP Web do WCF (Windows Communication Foundation) fornece os elementos básicos necessários para criar serviços HTTP Web com o WCF. Os serviços HTTP Web do WCF foram projetados para serem acessados pela maior variedade de clientes possíveis, incluindo navegadores da Web, e têm os seguintes requisitos exclusivos:

  • URIs e processamento de URI As URIs desempenham uma função central no design de serviços HTTP Web. O modelo de programação HTTP Web do WCF usa as classes UriTemplate e UriTemplateTable para fornecer funcionalidades de processamento de URI.

  • Suporte para operações GET e POST Os serviços HTTP Web usam o verbo GET para recuperação de dados, além de vários verbos de invocação para modificação de dados e invocação remota. O modelo de programação HTTP Web do WCF usa o WebGetAttribute e o WebInvokeAttribute para associar operações de serviço a GET e outros verbos HTTP, como PUT, POST e DELETE.

  • Vários formatos de dados Os serviços de estilo Web processam muitos tipos de dados, além de mensagens SOAP. O modelo de programação HTTP Web do WCF usa WebHttpBinding e WebHttpBehavior para dar suporte a vários formatos de dados diferentes, incluindo documentos XML, objeto de dados JSON e fluxos de conteúdo binário, como imagens, arquivos de vídeo ou texto sem formatação.

O modelo de programação HTTP Web do WCF estende o alcance do WCF para abranger cenários de estilo Web que incluem serviços HTTP Web, serviços AJAX e JSON e feeds de sindicalização (ATOM/RSS). Para obter mais informações sobre os serviços AJAX e JSON, confira Integração do AJAX e suporte a JSON. Para obter mais informações sobre a sindicalização, confira Visão geral da sindicalização do WCF.

Não há restrições extras sobre os tipos de dados que podem ser retornados de um serviço HTTP Web. Qualquer tipo serializável pode ser retornado de uma operação de serviço HTTP Web. Como as operações de serviço HTTP Web podem ser invocadas por um navegador da Web, há uma limitação sobre os tipos de dados que podem ser especificados em uma URL. Para obter mais informações sobre os tipos com suporte por padrão, confira a seção Parâmetros de cadeia de consulta de UriTemplate e URLs abaixo. O comportamento padrão pode ser alterado fornecendo uma implementação T:System.ServiceModel.Dispatcher.QueryStringConverter própria que especifica como converter os parâmetros especificados em uma URL no tipo de parâmetro real. Para obter mais informações, consulte QueryStringConverter.

Cuidado

Os serviços escritos com o modelo de programação HTTP Web do WCF não usam mensagens SOAP. Como SOAP não é usado, os recursos de segurança fornecidos pelo WCF não podem ser usados. No entanto, você pode usar a segurança baseada em transporte hospedando seu serviço com HTTPS. Para obter mais informações sobre a segurança do WCF, confira Visão geral de segurança

Aviso

A instalação da extensão WebDAV para o IIS pode fazer com que os serviços HTTP Web retornem um erro HTTP 405 enquanto a extensão WebDAV tenta lidar com todas as solicitações PUT. Para resolver esse problema, você pode desinstalar a extensão WebDAV ou desabilitar a extensão WebDAV do site. Para obter mais informações, confira IIS e WebDav

Processamento de URI com UriTemplate e UriTemplateTable

Os modelos de URI fornecem uma sintaxe eficiente para expressar grandes conjuntos de URIs estruturalmente semelhantes. Por exemplo, o modelo a seguir expressa o conjunto de todos os URIs de três segmentos que começam com "a" e terminam com "c" sem considerar o valor do segmento intermediário: a/{segment}/c

Este modelo descreve URIs como os seguintes:

  • a/x/c

  • a/y/c

  • a/z/c

  • e assim por diante.

Neste modelo, a notação de chaves ("{segmento}") indica um segmento variável em vez de um valor literal.

O .NET Framework fornece uma API para trabalhar com modelos de URI chamados UriTemplate. O UriTemplates permite que você faça o seguinte:

  • Você pode chamar um dos métodos Bind com um conjunto de parâmetros para produzir um URI totalmente fechado que corresponda ao modelo. Isso significa que todas as variáveis no modelo de URI são substituídas por valores reais.

  • Você pode chamar Match() com um URI candidato, que usa um modelo para dividir um URI candidato nas partes constituintes e retorna um dicionário que contém as diferentes partes do URI rotuladas de acordo com as variáveis no modelo.

  • Bind() e Match() são inversos, ou seja, você pode chamar Match( Bind( x ) ) e voltar com o mesmo ambiente com o qual começou.

Há muitas vezes (especialmente no servidor, em que a expedição de uma solicitação para uma operação de serviço baseada no URI é necessária) que você deseja manter o controle de um conjunto de objetos UriTemplate em uma estrutura de dados que pode lidar independentemente com cada um dos modelos contidos. UriTemplateTable representa um conjunto de modelos de URI e escolhe a melhor correspondência, dado um conjunto de modelos e um URI candidato. Isso não é afiliado a nenhuma pilha de rede específica (incluindo o WCF), ou seja, você pode usá-lo sempre que necessário.

O Modelo de Serviço do WCF usa UriTemplate e UriTemplateTable para associar as operações de serviço a um conjunto de URIs descrito por um UriTemplate. Uma operação de serviço está associada a um UriTemplate, usando o WebGetAttribute ou o WebInvokeAttribute. Para obter mais informações sobre UriTemplate e UriTemplateTable, confira UriTemplate e UriTemplateTable

Atributos WebGet e WebInvoke

Os serviços HTTP Web do WCF usam verbos de recuperação (por exemplo, HTTP GET) além de vários verbos de invocação (por exemplo, HTTP POST, PUT e DELETE). O modelo de programação HTTP Web do WCF permite que os desenvolvedores de serviço controlem o modelo de URI e o verbo associados às operações de serviço com WebGetAttribute e WebInvokeAttribute. O WebGetAttribute e o WebInvokeAttribute permitem que você controle como as operações individuais são associadas às URIs e aos métodos HTTP associados a esses URIs. Por exemplo, a adição de WebGetAttribute e WebInvokeAttribute no código a seguir.

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

  [WebGet]
  Customer GetCustomer():

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

O código anterior permite que você faça as solicitações HTTP a seguir.

GET /GetCustomer

POST /UpdateCustomerName

WebInvokeAttribute usa POST como padrão, mas você também pode usá-lo para outros 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 um exemplo completo de um serviço WCF que usa o modelo de programação HTTP Web do WCF, confira Como criar um serviço HTTP Web básico do WCF

Parâmetros e URLs da cadeia de consulta do UriTemplate

Os serviços no estilo Web podem ser chamados de um navegador da Web digitando uma URL associada a uma operação de serviço. Essas operações de serviço podem usar parâmetros de cadeia de consulta que precisam ser especificados em um formato de cadeia de caracteres dentro da URL. A tabela a seguir mostra os tipos que podem ser transmitidos de uma URL e o formato usado.

Type Format
Byte 0 - 255
SByte -128 – 127
Int16 -32.768 – 32.767
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 – 65.535
UInt32 0 – 4.294.967.295
UInt64 0 – 18.446.744.073.709.551.615
Single -3,402823e38 – 3,402823e38 (a notação exponencial não é necessária)
Double -1,79769313486232e308 – 1,79769313486232e308 (a notação exponencial não é necessária)
Char Qualquer caractere único
Decimal Qualquer decimal na notação padrão (sem expoente)
Boolean True ou False (não diferencia maiúsculas de minúsculas)
String Qualquer cadeia de caracteres (não há suporte para cadeia de caracteres nula e nenhum escape é feito)
DateTime MM/DD/AAAA

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

Mês Dia Ano

Mês Dia Ano HH:MM:SS [AM|PM]
TimeSpan DD.HH:MM:SS

Em que DD = dias, HH = horas, MM = minutos, SS = segundos
Guid Um GUID, por exemplo:

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

Em que DD = dias, HH = horas, MM = minutos, SS = segundos
Enumerações O valor de enumeração, por exemplo, que define a enumeração, conforme mostrado no código a seguir.

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

Qualquer um dos valores de enumeração individuais (ou os valores inteiros correspondentes) pode ser especificado na cadeia de consulta.
Os tipos que têm um TypeConverterAttribute que pode converter o tipo em uma representação de cadeia de caracteres. Depende do conversor de tipos.

Formatos e o modelo de programação HTTP Web do WCF

O modelo de programação HTTP Web do WCF tem novos recursos para trabalhar com vários formatos de dados diferentes. Na camada de associação, a WebHttpBinding pode ler e gravar os seguintes tipos diferentes de dados:

  • XML

  • JSON

  • Fluxos binários opacos

Isso significa que o modelo de programação HTTP Web do WCF pode processar qualquer tipo de dados, mas você pode fazer a programação em Stream.

O .NET Framework 3.5 fornece suporte para dados JSON (AJAX), bem como feeds de sindicalização (incluindo ATOM e RSS). Para obter mais informações sobre esses recursos, confira Formatação HTTP Web do WCF, Visão geral de sindicalização do WCF e Integração do AJAX e o suporte a JSON.

Modelo e segurança de programação HTTP Web do WCF

Como o modelo de programação HTTP Web do WCF não dá suporte aos protocolos WS-*, a única maneira de proteger um serviço HTTP Web do WCF é expor o serviço via HTTPS usando o SSL. Para obter mais informações sobre como configurar o SSL com o IIS 7.0, confira Como implementar o SSL no IIS.

Solução de problemas do modelo de programação HTTP Web do WCF

Ao chamar serviços HTTP Web do WCF usando um ChannelFactoryBase<TChannel> para criar um canal, o WebHttpBehavior usa o conjunto EndpointAddress no arquivo de configuração mesmo que um EndpointAddress diferente seja transmitido para o ChannelFactoryBase<TChannel>.

Confira também