Panoramica del modello di programmazione HTTP Web WCF
Il modello di programmazione HTTP WEB di Windows Communication Foundation (WCF) fornisce gli elementi di base necessari per compilare servizi HTTP WEB con WCF. I servizi HTTP WEB WCF sono progettati per essere accessibili dalla gamma più ampia di client possibili, inclusi i Web browser e hanno i requisiti univoci seguenti:
URI ed elaborazione degli URI Gli URI svolgono un ruolo centrale nella progettazione dei servizi HTTP WEB. Il modello di programmazione HTTP WEB WCF usa le classi UriTemplate e UriTemplateTable per fornire funzionalità di elaborazione URI.
supporto per le operazioni GET e POST i servizi HTTP WEB usano il verbo GET per il recupero dei dati, oltre a vari verbi invoke per la modifica dei dati e la chiamata remota. Il modello di programmazione HTTP WEB WCF usa il WebGetAttribute e WebInvokeAttribute per associare le operazioni del servizio sia a GET che ad altri verbi HTTP come PUT, POST e DELETE.
Più formati di dati servizi in stile Web elaborano molti tipi di dati oltre ai messaggi SOAP. Il modello di programmazione HTTP WEB WCF usa il WebHttpBinding e WebHttpBehavior per supportare molti formati di dati diversi, tra cui documenti XML, oggetti dati JSON e flussi di contenuto binario, ad esempio immagini, file video o testo normale.
Il modello di programmazione HTTP WEB WCF estende la portata di WCF per gli scenari in stile Web che includono servizi HTTP WEB, servizi AJAX e JSON e feed Syndication (ATOM/RSS). Per altre informazioni sui servizi AJAX e JSON, vedere L'integrazione AJAX e il supporto JSON. Per ulteriori informazioni sulla Syndication, vedere la Panoramica WCF Syndication.
Non esistono restrizioni aggiuntive sui tipi di dati che possono essere restituiti da un servizio HTTP WEB. Qualsiasi tipo serializzabile può essere restituito da un'operazione del servizio HTTP WEB. Poiché le operazioni del servizio HTTP WEB possono essere richiamate da un Web browser esiste una limitazione sui tipi di dati che è possibile specificare in un URL. Per altre informazioni sui tipi supportati per impostazione predefinita, vedere la sezione UriTemplate Query String Parameters and URLs di seguito. Il comportamento predefinito può essere modificato fornendo un'implementazione T:System.ServiceModel.Dispatcher.QueryStringConverter che specifica come convertire i parametri specificati in un URL nel tipo di parametro effettivo. Per altre informazioni, vedere QueryStringConverter
Cautela
I servizi scritti con il modello di programmazione HTTP WEB WCF non usano messaggi SOAP. Poiché SOAP non viene utilizzato, non è possibile utilizzare le funzionalità di sicurezza fornite da WCF. È tuttavia possibile usare la sicurezza basata sul trasporto ospitando il servizio con HTTPS. Per altre informazioni sulla sicurezza WCF, vedere Panoramica della sicurezza di .
Avvertimento
L'installazione dell'estensione WebDAV per IIS può causare la restituzione di un errore HTTP 405 da parte dei servizi HTTP Web quando l'estensione WebDAV tenta di gestire tutte le richieste PUT. Per risolvere questo problema, è possibile disinstallare l'estensione WebDAV o disabilitare l'estensione WebDAV per il sito Web. Per altre informazioni, vedere IIS e WebDav.
Elaborazione URI con UriTemplate e UriTemplateTable
I modelli URI offrono una sintassi efficiente per esprimere grandi set di URI strutturalmente simili. Ad esempio, il modello seguente esprime il set di tutti gli URI a tre segmenti che iniziano con "a" e terminano con "c" senza considerare il valore del segmento intermedio: a/{segment}/c
Questo modello descrive gli URI simili ai seguenti:
a/x/c
a/y/c
a/z/c
E così via.
In questo modello, la notazione con parentesi graffe ("{segment}") indica un segmento variabile anziché un valore letterale.
.NET Framework fornisce un'API per l'uso di modelli URI denominati UriTemplate.
UriTemplates
consente di eseguire le seguenti operazioni:
È possibile chiamare uno dei metodi di
Bind
con un set di parametri per produrre un URI completamente chiuso che corrisponde al modello. Ciò significa che tutte le variabili all'interno del modello URI vengono sostituite con i valori effettivi.È possibile chiamare
Match
() con un URI candidato, che usa un modello per suddividere un URI candidato nelle parti costitutive e restituisce un dizionario che contiene le diverse parti dell'URI etichettate in base alle variabili nel modello.Bind
() eMatch
() sono inverse in modo da poter chiamareMatch
(Bind
( x ) ) e tornare con lo stesso ambiente con cui si è iniziato.
Esistono molte volte (soprattutto nel server, in cui è necessario inviare una richiesta a un'operazione del servizio in base all'URI) che si vuole tenere traccia di un set di oggetti UriTemplate in una struttura di dati in grado di gestire in modo indipendente ognuno dei modelli contenuti. UriTemplateTable rappresenta un set di modelli URI e seleziona la corrispondenza migliore in base a un set di modelli e a un URI candidato. Questo non è associato a uno stack di rete specifico (WCF incluso) in modo da poterlo usare ovunque necessario.
Il modello di servizio WCF usa UriTemplate e UriTemplateTable per associare le operazioni del servizio a un set di URI descritti da un UriTemplate. Un'operazione di servizio è associata a un UriTemplate, utilizzando il WebGetAttribute o il WebInvokeAttribute. Per altre informazioni su UriTemplate e UriTemplateTable, vedere UriTemplate e UriTemplateTable.
Attributi WebGet e WebInvoke
I servizi HTTP WEB WCF usano verbi di recupero (ad esempio HTTP GET) oltre a vari verbi invoke (ad esempio HTTP POST, PUT e DELETE). Il modello di programmazione HTTP WEB WCF consente agli sviluppatori di servizi di controllare il modello URI e il verbo associati alle operazioni del servizio con il WebGetAttribute e WebInvokeAttribute. Le WebGetAttribute e le WebInvokeAttribute consentono di controllare il modo in cui le singole operazioni vengono associate agli URI e ai metodi HTTP associati a tali URI. Ad esempio, aggiungere WebGetAttribute e WebInvokeAttribute nel codice seguente.
[ServiceContract]
interface ICustomer
{
//"View It"
[WebGet]
Customer GetCustomer():
//"Do It"
[WebInvoke]
Customer UpdateCustomerName( string id,
string newName );
}
Il codice precedente consente di effettuare le richieste HTTP seguenti.
GET /GetCustomer
POST /UpdateCustomerName
WebInvokeAttribute è impostato su POST per impostazione predefinita, ma può essere utilizzato anche per altri verbi.
[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 );
}
Per un esempio completo di un servizio WCF che usa il modello di programmazione HTTP WEB WCF, vedere procedura : Creare un servizio HTTP Web WCF di base.
Parametri della stringa di query e URL in UriTemplate
I servizi in stile Web possono essere chiamati da un Web browser digitando un URL associato a un'operazione del servizio. Queste operazioni del servizio possono accettare parametri di stringa di query che devono essere specificati in un formato stringa all'interno dell'URL. La tabella seguente illustra i tipi che possono essere passati all'interno di un URL e il formato usato.
Digitare | 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 (notazione esponente non richiesta) |
Double | -1.79769313486232e308 - 1.79769313486232e308 (notazione esponente non obbligatoria) |
Char | Qualsiasi carattere singolo |
Decimal | Qualsiasi decimale nella notazione standard (nessun esponente) |
Boolean | True o False (senza distinzione tra maiuscole e minuscole) |
String | Qualsiasi stringa (la stringa Null non è supportata e non viene eseguita alcuna escape) |
DateTime | MM/GG/AAAA MM/GG/AAAA HH:MM:SS [AM|PM] giorno mese anno Anno giorno mese HH:MM:SS [AM|PM] |
TimeSpan | DD.HH:MM:SS Dove DD = Giorni, HH = Ore, MM = minuti, SS = Secondi |
Guid | Un GUID, ad esempio: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
DateTimeOffset | MM/GG/AAAA HH:MM:SS MM:SS Dove DD = Giorni, HH = Ore, MM = minuti, SS = Secondi |
Enumerazioni | Valore di enumerazione, ad esempio, che definisce l'enumerazione come illustrato nel codice seguente.public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; Nella stringa di query è possibile specificare uno dei singoli valori di enumerazione (o i relativi valori interi corrispondenti). |
Tipi con un TypeConverterAttribute in grado di convertire il tipo in e da una rappresentazione di stringa. |
Dipende dal convertitore di tipi. |
Formati e modello di programmazione HTTP WEB WCF
Il modello di programmazione HTTP WEB WCF include nuove funzionalità per funzionare con molti formati di dati diversi. A livello di associazione, il WebHttpBinding può leggere e scrivere i diversi tipi di dati seguenti:
- XML
- JSON
- Flussi binari opachi
Ciò significa che il modello di programmazione HTTP WEB WCF può gestire qualsiasi tipo di dati, ma potresti trovarti a programmare contro Stream.
.NET Framework 3.5 fornisce il supporto per i dati JSON (AJAX) e i feed di diffusione (inclusi ATOM e RSS). Per altre informazioni su queste funzionalità, vedere WCF Web HTTP Formatting, WCF Syndication Overviewe AJAX Integration and JSON Support.
Sicurezza e modello di programmazione HTTP WEB WCF
Poiché il modello di programmazione HTTP WEB WCF non supporta i protocolli WS-*, l'unico modo per proteggere un servizio HTTP WEB WCF consiste nell'esporre il servizio tramite HTTPS tramite SSL. Per altre informazioni sulla configurazione di SSL con IIS 7.0, vedere Come implementare SSL in IIS.
Risoluzione dei problemi relativi al modello di programmazione HTTP WEB WCF
Quando si chiamano i servizi HTTP WEB WCF tramite un ChannelFactoryBase<TChannel> per creare un canale, il WebHttpBehavior usa il EndpointAddress impostato nel file di configurazione anche se viene passato un EndpointAddress diverso al ChannelFactoryBase<TChannel>.