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() e Match() sono inverse, pertanto è possibile chiamare Match( 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>.

Vedi anche