Panoramica sul 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 di WCF sono progettati per consentire l'accesso alla tipologia più ampia di possibili client (inclusi i browser Web senza alcun framework client aggiuntivo) e sono caratterizzati dai requisiti univoci seguenti:
URI ed elaborazione di URI Gli URI svolgono un ruolo centrale nella progettazione dei servizi HTTP Web. Nel modello di programmazione HTTP Web di WCF vengono utilizzate le classi UriTemplate e UriTemplateTable per fornire le funzionalità di elaborazione URI.
Supporto per operazioni GET e POST I servizi HTTP Web si avvalgono del verbo GET per recuperare i dati, oltre a numerosi verbi di chiamata per modificare i dati e per chiamate remote. Nel modello di programmazione HTTP Web di WCF vengono utilizzati gli oggetti WebGetAttribute e WebInvokeAttribute per associare le operazioni del servizio sia al verbo GET che ad altri verbi HTTP, ad esempio PUT, POST e DELETE.
Più formati di dati Oltre ai messaggi SOPA, i servizi Web consentono di elaborare numerosi tipi di dati. Nel modello di programmazione HTTP Web di WCF vengono utilizzati gli oggetti WebHttpBinding e WebHttpBehavior per supportare numerosi formati di dati diversi, ad esempio documenti XML, oggetti dati JSON e flussi di contenuto binario quale immagini, file video o testo normale.
Il modello di programmazione HTTP Web di WCF estende la portata di WCF per supportare scenari di tipo Web, ad esempio servizi HTTP Web, servizi AJAX e JSON e feed ATOM/RSS. Per altre informazioni sui servizi AJAX e JSON, vedere Integrazione AJAX e supporto JSON. Per altre informazioni sulla diffusione, vedere Panoramica sulla diffusione di WCF.
Non sono previste 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 per i tipi di dati che possono essere specificati in un URL. Per ulteriori informazioni sui tipi supportati per impostazione predefinita, vedere la sezione relativa a URL e parametri della stringa di query di UriTemplate riportata di seguito. È possibile modificare il comportamento predefinito fornendo l'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.
Attenzione
I servizi creati nel modello di programmazione WCF non utilizzano messaggi SOAP. Per questo motivo le funzionalità di sicurezza disponibili in WCF non possono essere utilizzate. È tuttavia possibile implementare la sicurezza basata sul trasporto ospitando il servizio con HTTPS. Per altre informazioni sulla sicurezza per le applicazioni WCF, vedere Panoramica della sicurezza
Avviso
L'installazione dell'estensione WebDAV per IIS può causare la restituzione di un errore HTTP 405 da parte dei servizi HTTP Web quando tramite l'estensione WebDAV viene effettuato il tentativo di gestire tutte le richieste PUT. Per risolvere questo problema è possibile disinstallare l'estensione WebDAV o disabilitarla per il sito Web. Per altre informazioni, vedere la IIS e WebDav
Elaborazione di URI con UriTemplate e UriTemplateTable
I modelli URI forniscono una sintassi efficiente per esprimere grandi set di URI strutturalmente simili. Nel modello seguente, ad esempio, viene espresso il set di tutti gli URI di tre segmenti che iniziano con "a" e terminano con "c", a prescindere dal valore del segmento intermedio: a/{segment}/c
In questo modello vengono descritti URI come il seguente:
a/x/c
a/y/c
a/z/c
e così via
In questo modello, la notazione tra parentesi graffe ("{segment}") indica un segmento variabile anziché un valore letterale.
In .NET Framework è disponibile un'API da utilizzare con i modelli URI denominata UriTemplate. Con UriTemplates
è possibile effettuare le seguenti operazioni:
È possibile chiamare uno dei metodi
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 utilizza un modello per suddividere un URI candidato nelle sue parti costitutive e restituisce un dizionario che contiene le varie parti dell'URI etichettate in base alle variabili nel modello.Bind
() eMatch
() sono inverse, pertanto è possibile chiamareMatch
(Bind
( x ) ) e ottenere lo stesso ambiente dal quale si è partiti.
Spesso si desidera tenere traccia (specialmente sul server, dove è necessario inviare una richiesta a un'operazione del servizio basata sull'URI) di un set di oggetti UriTemplate in una struttura dati che possa fare riferimento in modo indipendente a ciascuno dei modelli contenuti. UriTemplateTable rappresenta un set di modelli URI e seleziona la migliore corrispondenza in base a un set di modelli e a un URI candidato. Ciò non è affiliato ad alcuno stack di rete particolare (WCF incluso), pertanto è possibile utilizzarlo ovunque sia necessario.
Il modello di servizio WCF si avvale di UriTemplate e UriTemplateTable per associare operazioni del servizio a un set di URI descritti da un UriTemplate. Un'operazione del servizio viene associata a un UriTemplate, utilizzando WebGetAttribute o WebInvokeAttribute. Per altre informazioni su UriTemplate e UriTemplateTable, vedere UriTemplate e UriTemplateTable
Attributi WebGet e WebInvoke
I servizi HTTP Web di WCF si avvalgono di verbi di recupero (ad esempio HTTP GET) oltre a numerosi verbi di chiamata (ad esempio HTTP POST, PUT e DELETE). Il modello di programmazione HTTP Web di WCF consente agli sviluppatori del servizio di controllare sia il modello URI che il verbo associato alle relative operazioni del servizio con gli oggetti WebGetAttribute e WebInvokeAttribute. WebGetAttribute e WebInvokeAttribute consentono di controllare l'associazione di singole operazioni con gli URI e i metodi HTTP associati a detti URI. L'aggiunta di WebGetAttribute e WebInvokeAttribute, ad esempio, 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
L'impostazione predefinita di WebInvokeAttribute è POST ma è possibile utilizzarlo 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 visualizzare 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
Nome del parametro della stringa di query UriTemplate e URL.
I servizi Web possono essere chiamati da un browser Web digitando un URL associato a un'operazione del servizio. Queste operazioni del servizio possono accettare parametri della stringa di query che devono essere specificati in un formato stringa all'interno dell'URL. Nella tabella seguente vengono illustrati i tipi che è possibile passare all'interno di un URL e il formato utilizzato.
Type | 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 (la notazione esponenziale non è obbligatoria) |
Double | -1,79769313486232e308 - 1,79769313486232e308 (la notazione esponenziale non è obbligatoria) |
Char | Un solo carattere |
Decimal | Qualsiasi numero decimale in notazione standard (nessun esponente) |
Boolean | True o False (senza distinzione maiuscole/minuscole) |
String | Qualsiasi stringa (la stringa null non è supportata e non viene effettuata alcuna operazione di escape) |
DateTime | MM/DD/YYYY MM/GG/AAAA HH:MM:SS [AM|PM] Mese Giorno Anno Mese Giorno Anno HH:MM:SS [AM|PM] |
TimeSpan | GG.HH:MM:SS Dove GG = 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 GG = Giorni, HH = Ore, MM = Minuti, SS = Secondi |
Enumerazioni | Valore di enumerazione 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 qualsiasi dei singoli valori di enumerazione (o i valori integer corrispondenti). |
Tipi con TypeConverterAttribute in grado di convertire il tipo in e da una rappresentazione di stringa. |
Dipende dal convertitore del tipo. |
Formati e modello di programmazione HTTP Web WCF
Nel modello di programmazione HTTP Web di WCF sono disponibili nuove funzionalità che consentono di utilizzare numerosi formati di dati diversi. A livello di associazione, WebHttpBinding è in grado di leggere e scrivere i diversi tipi di dati seguenti:
XML
JSON
Flussi binari opachi
Questo significa che il modello di programmazione HTTP Web di WCF è in grado di gestire qualsiasi tipo di dati WEB HTTP, ma la programmazione potrebbe essere eseguita rispetto a Stream.
.NET Framework 3.5 fornisce supporto sia per i dati JSON (AJAX) sia per i feed di diffusione (inclusi ATOM e RSS). Per altre informazioni su queste funzionalità, vedere Formattazione HTTP Web WCF, Panoramica sulla diffusione WCF e Integrazione AJAX e supporto JSON.
Modello di programmazione HTTP Web WCF e sicurezza
Poiché il modello di programmazione HTTP Web di WCF non supporta i protocolli WS-*, l'unico modo per proteggere un servizio HTTP Web di WCF consiste nell'esporre il servizio su HTTPS tramite SSL. Per altre informazioni sulla configurazione di SSL con IIS 7.0, vedere Come implementare SSL in IIS.
Risoluzione dei problemi nel modello di programmazione HTTP WEb WCF
Quando si chiamano i servizi HTTP Web WCF utilizzando un oggetto ChannelFactoryBase<TChannel> per creare un canale, l'oggetto WebHttpBehavior utilizza l'oggetto EndpointAddress impostato nel file di configurazione anche se un oggetto EndpointAddress viene passato all'oggetto ChannelFactoryBase<TChannel>.