Compartilhar via


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

O modelo de programação HTTP DA WEB do Windows Communication Foundation (WCF) fornece os elementos básicos necessários para criar serviços HTTP web com o WCF. Os serviços HTTP da 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 da Web do WCF usa as classes UriTemplate e UriTemplateTable para fornecer recursos de processamento de URI.

  • Suporte para operações GET e POST Serviços HTTP Web fazem uso do 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 da Web do WCF usa o WebGetAttribute e WebInvokeAttribute para associar operações de serviço tanto com o verbo GET quanto com outros verbos HTTP, como PUT, POST e DELETE.

  • Vários formatos de dados serviços de estilo Web processam muitos tipos de dados, além de mensagens SOAP. O modelo de programação HTTP da Web do WCF usa o WebHttpBinding e WebHttpBehavior para dar suporte a muitos 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 WEB HTTP do WCF estende o alcance do WCF para abranger cenários de estilo Web que incluem serviços WEB HTTP, serviços AJAX e JSON, e feeds ATOM/RSS. Para obter mais informações sobre os serviços AJAX e JSON, consulte as seções intituladas "Integração AJAX" e "Suporte JSON" em e. Para obter mais informações sobre a sindicalização, confira Visão geral da sindicalização do WCF.

Não há restrições adicionais 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 quais tipos de dados 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 sua própria implementação T:System.ServiceModel.Dispatcher.QueryStringConverter que especifica como converter os parâmetros especificados em uma URL para o tipo de parâmetro real. Para obter mais informações, consulte QueryStringConverter

Cuidado

Os serviços gravados com o modelo de programação HTTP DA 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, consulte Visão geral de segurança.

Aviso

A instalação da extensão WebDAV para IIS pode fazer com que os serviços HTTP Da Web retornem um erro HTTP 405 à medida que a extensão WebDAV tenta lidar com todas as solicitações PUT. Para contornar esse problema, você pode desinstalar a extensão WebDAV ou desabilitar a extensão WebDAV para seu 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 todas as URIs de três segmentos que começam com "a" e terminam com "c" sem levar em conta o valor do segmento intermediário: a/{segment}/c

Este modelo descreve URIs como as 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. 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 corresponde ao modelo. Isso significa que todas as variáveis dentro do 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 em suas 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 para que você possa chamar Match( Bind( x ) ) e voltar com o mesmo ambiente com que você começou.

Há muitas vezes (especialmente no servidor, em que o envio de uma solicitação para uma operação de serviço com base no URI é necessário) que você deseja controlar um conjunto de objetos UriTemplate em uma estrutura de dados que pode abordar independentemente cada um dos modelos contidos. UriTemplateTable representa um conjunto de modelos de URI e seleciona 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 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, consulte UriTemplate e UriTemplateTable.

Atributos WebGet e WebInvoke

Os serviços HTTP DA 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 controlar como as operações individuais são associadas a URIs e aos métodos HTTP associados a esses URIs. Por exemplo, adicionar 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 seguintes solicitações HTTP.

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 obter um exemplo completo de um serviço WCF que usa o modelo de programação HTTP da Web do WCF, consulte Como criar um serviço HTTP Web WCF básico.

Parâmetros e URLs da cadeia de consulta do UriTemplate

Os serviços em estilo Web podem ser chamados de um navegador digitando a URL associada a uma operação de serviço. Essas operações de serviço podem usar parâmetros de cadeia de caracteres de consulta que devem ser especificados em um formulário de cadeia de caracteres dentro da URL. A tabela a seguir mostra os tipos que podem ser passados dentro de uma URL e o 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 (a notação do expoente não é necessária)
Double -1.79769313486232e308 - 1.79769313486232e308 (notação de expoente 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/YYYY

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

Mês Dia Ano

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

Onde 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

Onde 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 seus valores inteiros correspondentes) pode ser especificado na cadeia de caracteres 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 WEB HTTP do WCF

O modelo de programação HTTP da Web do WCF tem novos recursos para trabalhar com vários formatos de dados diferentes. Na camada de associação, o 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 sindicaçã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 de Programação WEB HTTP do WCF e Segurança

Como o modelo de programação HTTP DA 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 por HTTPS usando SSL. Para obter mais informações sobre como configurar o SSL com o IIS 7.0, consulte How to implement SSL in IIS.

Solução de problemas do modelo de programação HTTP DA 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>.

Consulte também