Visão geral do modelo de programação Web HTTP do WCF
O modelo de programação Web HTTP do Windows Communication Foundation (WCF) fornece os elementos básicos necessários para criar serviços HTTP WEB com WCF. Os serviços WCF WEB HTTP são projetados para serem acessados pela maior variedade possível de clientes, incluindo navegadores da Web e têm os seguintes requisitos exclusivos:
URIs e URIs de processamento de URIs desempenham um papel central no design de serviços HTTP WEB. O modelo de programação WCF WEB HTTP usa as UriTemplate classes e UriTemplateTable para fornecer recursos de processamento de URI.
Suporte para operações GET e POST Os 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 WCF WEB HTTP usa o WebGetAttribute e WebInvokeAttribute para associar operações de serviço com GET e 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 WCF WEB HTTP usa o WebHttpBinding e WebHttpBehavior para suportar 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 WCF WEB HTTP estende o alcance do WCF para cobrir cenários de estilo Web que incluem serviços HTTP WEB, serviços AJAX e JSON e feeds de distribuição (ATOM/RSS). Para obter mais informações sobre os serviços AJAX e JSON, consulte Integração AJAX e suporte JSON. Para obter mais informações sobre Syndication, consulte WCF Syndication Overview.
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 do 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 quais tipos são suportados por padrão, consulte a seção URLs e parâmetros de cadeia de caracteres de consulta UriTemplate. 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 mais informações, consulte QueryStringConverter
Atenção
Serviços escritos com o modelo de programação WCF WEB HTTP não usam mensagens SOAP. Como o SOAP não é usado, os recursos de segurança fornecidos pelo WCF não podem ser usados. Você pode, no entanto, usar a segurança baseada em transporte hospedando seu serviço com HTTPS. Para obter mais informações sobre segurança WCF, consulte Visão geral da 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 enquanto a extensão WebDAV tenta lidar com todas as solicitações PUT. Para contornar esse problema, você pode desinstalar a extensão WebDAV ou desativar a extensão WebDAV para seu site. Para obter mais informações, consulte 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 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/a/c
a/z/c
e assim por diante.
Neste modelo, a notação de chave curva ("{segment}") 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
permitir que você faça o seguinte:
Você pode chamar um dos
Bind
métodos com um conjunto de parâmetros para produzir um URI totalmente fechado que corresponda 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
() eMatch
() são inversos para que você possa chamarMatch
(Bind
( x ) e voltar com o mesmo ambiente com o qual começou.
Há muitas vezes (especialmente no servidor, onde o envio de uma solicitação para uma operação de serviço com base no URI é necessário) que você deseja manter o controle de um conjunto de objetos em uma estrutura de UriTemplate 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 (WCF incluído) para que você possa usá-lo sempre que necessário.
O Modelo de Serviço WCF usa e UriTemplateTable associa operações de UriTemplate serviço a um conjunto de URIs descritos por um UriTemplate. Uma operação de serviço está associada a um UriTemplate, usando o ou o WebInvokeAttributeWebGetAttribute . Para obter mais informações sobre UriTemplate e UriTemplateTable, consulte UriTemplate e UriTemplateTable
Atributos WebGet e WebInvoke
Os serviços WCF WEB HTTP fazem uso de 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 WCF WEB HTTP permite que os desenvolvedores de serviços controlem o modelo de URI e o verbo associados às suas operações de serviço com o WebGetAttribute e WebInvokeAttribute. O WebGetAttribute e o permitem controlar como operações WebInvokeAttribute individuais são vinculadas a URIs e os métodos HTTP associados a esses URIs. Por exemplo, adicionando 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 padrão para POST, mas você pode usá-lo para outros verbos também.
[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 WCF WEB HTTP, consulte Como: Criar um serviço básico WCF Web HTTP
Parâmetros e URLs da cadeia de caracteres de consulta UriTemplate
Os serviços de estilo da Web podem ser chamados a partir de um navegador da Web digitando uma URL associada a uma operação de serviço. Essas operações de serviço podem ter 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 (notação expoente não é necessária) |
Double | -1.79769313486232e308 - 1.79769313486232e308 (notação expoente não é necessária) |
Char | Qualquer caractere único |
Decimal | Qualquer decimal na notação padrão (sem expoente) |
Boolean | Verdadeiro ou Falso (não diferencia maiúsculas de minúsculas) |
String | Qualquer string (string nula não é suportada e nenhuma fuga é feita) |
DateTime | MM/DD/AAAA MM/DD/AAAA HH:MM:SS [AM|PM] Mês Dia Ano Mês Dia 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/AAAA 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 como 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. |
Tipos que têm um TypeConverterAttribute que pode converter o tipo de e para uma representação de cadeia de caracteres. |
Depende do conversor de tipo. |
Formatos e o modelo de programação WCF WEB HTTP
O modelo de programação WCF WEB HTTP tem novos recursos para trabalhar com muitos formatos de dados diferentes. Na camada de vinculaçã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 WCF WEB HTTP pode lidar com qualquer tipo de dados, mas você pode estar programando contra Stream.
O .NET Framework 3.5 fornece suporte para dados JSON (AJAX), bem como feeds de distribuição (incluindo ATOM e RSS). Para obter mais informações sobre esses recursos, consulte WCF Web HTTP Formatting, WCF Syndication Overview, AJAX Integration and JSON Support.
Modelo de programação e segurança WCF WEB HTTP
Como o modelo de programação WCF WEB HTTP não suporta os protocolos WS-*, a única maneira de proteger um serviço WCF WEB HTTP é expor o serviço por HTTPS usando SSL. Para obter mais informações sobre como configurar o SSL com o IIS 7.0, consulte Como implementar o SSL no IIS.
Solução de problemas do modelo de programação WCF WEB HTTP
Ao chamar serviços WCF WEB HTTP usando um ChannelFactoryBase<TChannel> para criar um canal, o WebHttpBehavior usa o EndpointAddress conjunto no arquivo de configuração, mesmo que um diferente EndpointAddress seja passado para o ChannelFactoryBase<TChannel>.