Introduzione ai servizi Web

Questa guida illustra come utilizzare tecnologie di servizio Web diverse. Gli argomenti trattati includono la comunicazione con i servizi REST, i servizi SOAP e i servizi Windows Communication Foundation.

Per funzionare correttamente, molte applicazioni per dispositivi mobili dipendono dal cloud e quindi l'integrazione di servizi Web nelle applicazioni per dispositivi mobili è uno scenario comune. La piattaforma Xamarin supporta l'utilizzo di tecnologie di servizio Web diverse e include il supporto predefinito e di terze parti per l'utilizzo di servizi RESTful, ASMX e Windows Communication Foundation (WCF).

Per i clienti che usano Xamarin.Forms, sono disponibili esempi completi che usano ognuna di queste tecnologie nella documentazione di Servizi Web Xamarin.Forms.

Importante

In iOS 9, App Transport Security (ATS) applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app, impedendo così la divulgazione accidentale di informazioni riservate. Poiché ATS è abilitato per impostazione predefinita nelle app compilate per iOS 9, tutte le connessioni saranno soggette ai requisiti di sicurezza di ATS. Se le connessioni non soddisfano questi requisiti, avranno esito negativo con un'eccezione.

È possibile rifiutare esplicitamente ATS se non è possibile usare il protocollo e proteggere la HTTPS comunicazione per le risorse Internet. A tale scopo, aggiornare il file Info.plist dell'app. Per altre informazioni, vedere App Transport Security.

REST

REST (Representational State Transfer) è uno stile di architettura per la creazione di servizi Web. Le richieste REST vengono effettuate tramite HTTP usando gli stessi verbi HTTP usati dai Web browser per recuperare pagine Web e inviare dati ai server. I verbi sono:

  • GET - Questa operazione viene usata per recuperare dati dal servizio Web.
  • POST - Questa operazione viene usata per creare un nuovo elemento di dati nel servizio Web.
  • PUT - Questa operazione viene usata per aggiornare un elemento di dati nel servizio Web.
  • PATCH - Questa operazione viene usata per aggiornare un elemento di dati nel servizio Web descrivendo un set di istruzioni sulla modalità di modifica dell'elemento. Questo verbo non viene usato nell'applicazione di esempio.
  • DELETE - Questa operazione viene usata per eliminare un elemento di dati nel servizio Web.

Le API del servizio Web conformi a REST sono denominate API RESTful e vengono definite usando:

  • URI di base.
  • Metodi HTTP, ad esempio GET, POST, PUT, PATCH o DELETE.
  • Tipo di supporto per i dati, ad esempio JavaScript Object Notation (JSON).

La semplicità di REST ha contribuito a renderlo il metodo principale per l'accesso ai servizi Web nelle applicazioni per dispositivi mobili.

Utilizzo di servizi REST

Sono disponibili numerose librerie e classi che possono essere usate per utilizzare i servizi REST e le sottosezioni seguenti le illustrano. Per altre informazioni sull'utilizzo di un servizio REST, vedere Utilizzare un servizio Web RESTful.

HttpClient

Le librerie client HTTP Microsoft forniscono la HttpClient classe , usata per inviare e ricevere richieste tramite HTTP. Fornisce funzionalità per l'invio di richieste HTTP e la ricezione di risposte HTTP da una risorsa identificata dall'URI. Ogni richiesta viene inviata come operazione asincrona. Per altre informazioni sulle operazioni asincrone, vedere Panoramica del supporto asincrono.

La HttpResponseMessage classe rappresenta un messaggio di risposta HTTP ricevuto dal servizio Web dopo che è stata effettuata una richiesta HTTP. Contiene informazioni sulla risposta, inclusi il codice di stato, le intestazioni e il corpo. La HttpContent classe rappresenta il corpo HTTP e le intestazioni del contenuto, ad esempio Content-Type e Content-Encoding. Il contenuto può essere letto usando uno dei ReadAs metodi, ad esempio ReadAsStringAsync e ReadAsByteArrayAsync, a seconda del formato dei dati.

Per altre informazioni sulla HttpClient classe , vedere Creazione dell'oggetto HTTPClient.

HTTPWebRequest

La chiamata di servizi Web con HTTPWebRequest comporta:

  • Creazione dell'istanza della richiesta per un URI specifico.
  • Impostazione di varie proprietà HTTP nell'istanza della richiesta.
  • Recupero di un oggetto HttpWebResponse dalla richiesta.
  • Lettura dei dati dalla risposta.

Ad esempio, il codice seguente recupera i dati dal servizio Web U.S. National Library of Medicine:

var rxcui = "198440";
var request = HttpWebRequest.Create(string.Format(@"https://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui));
request.ContentType = "application/json";
request.Method = "GET";

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
  if (response.StatusCode != HttpStatusCode.OK)
     Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
  using (StreamReader reader = new StreamReader(response.GetResponseStream()))
  {
               var content = reader.ReadToEnd();
               if(string.IsNullOrWhiteSpace(content)) {
                       Console.Out.WriteLine("Response contained empty body...");
               }
               else {
                       Console.Out.WriteLine("Response Body: \r\n {0}", content);
               }

               Assert.NotNull(content);
  }
}

L'esempio precedente crea un oggetto HttpWebRequest che restituirà i dati formattati come JSON. I dati vengono restituiti in un HttpWebResponseoggetto , da cui è possibile ottenere un StreamReader oggetto per leggere i dati.

RestSharp

Un altro approccio all'utilizzo dei servizi REST consiste nell'usare la libreria RestSharp . RestSharp incapsula le richieste HTTP, incluso il supporto per il recupero dei risultati come contenuto stringa non elaborato o come oggetto C# deserializzato. Ad esempio, il codice seguente effettua una richiesta al servizio Web Libreria nazionale di medicina statunitense e recupera i risultati come stringa in formato JSON:

var request = new RestRequest(string.Format("{0}/allinfo", rxcui));
request.RequestFormat = DataFormat.Json;
var response = Client.Execute(request);
if(string.IsNullOrWhiteSpace(response.Content) || response.StatusCode != System.Net.HttpStatusCode.OK) {
       return null;
}
rxTerm = DeserializeRxTerm(response.Content);

DeserializeRxTerm è un metodo che accetta la stringa JSON non elaborata dalla RestSharp.RestResponse.Content proprietà e la converte in un oggetto C#. La deserializzazione dei dati restituiti dai servizi Web viene descritta più avanti in questo articolo.

NSUrl Connessione ion

Oltre alle classi disponibili nella libreria di classi base (BCL), ad esempio HttpWebRequest, e librerie C# di terze parti, ad esempio RestSharp, sono disponibili anche classi specifiche della piattaforma per l'utilizzo dei servizi Web. Ad esempio, in iOS è possibile usare le NSUrlConnection classi e NSMutableUrlRequest .

L'esempio di codice seguente illustra come chiamare il servizio Web U.S. National Library of Medicine usando le classi iOS:

var rxcui = "198440";
var request = new NSMutableUrlRequest(new NSUrl(string.Format("https://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui)),
       NSUrlRequestCachePolicy.ReloadRevalidatingCacheData, 20);
request["Accept"] = "application/json";

var connectionDelegate = new RxTermNSURLConnectionDelegate();
var connection = new NSUrlConnection(request, connectionDelegate);
connection.Start();

public class RxTermNSURLConnectionDelegate : NSUrlConnectionDelegate
{
       StringBuilder _ResponseBuilder;
       public bool IsFinishedLoading { get; set; }
       public string ResponseContent { get; set; }

       public RxTermNSURLConnectionDelegate()
               : base()
       {
               _ResponseBuilder = new StringBuilder();
       }

       public override void ReceivedData(NSUrlConnection connection, NSData data)
       {
               if(data != null) {
                       _ResponseBuilder.Append(data.ToString());
               }
       }
       public override void FinishedLoading(NSUrlConnection connection)
       {
               IsFinishedLoading = true;
               ResponseContent = _ResponseBuilder.ToString();
       }
}

In genere, le classi specifiche della piattaforma per l'utilizzo dei servizi Web devono essere limitate agli scenari in cui il codice nativo viene convertito in C#. Se possibile, il codice di accesso al servizio Web deve essere portabile in modo che possa essere condiviso multipiattaforma.

ServiceStack

Un'altra opzione per chiamare i servizi Web è la libreria di Service Stack . Ad esempio, il codice seguente illustra come usare il metodo dello stack di servizi per emettere una richiesta di IServiceClient.GetAsync servizio:

client.GetAsync<CustomersResponse>("",
          (response) => {
               foreach(var c in response.Customers) {
                       Console.WriteLine(c.CompanyName);
               }
       },
       (response, ex) => {
               Console.WriteLine(ex.Message);
       });

Importante

Anche se gli strumenti come ServiceStack e RestSharp semplificano la chiamata e l'utilizzo dei servizi REST, talvolta non è semplice usare XML o JSON che non è conforme alle convenzioni di serializzazione standard di DataContract . Se necessario, richiamare la richiesta e gestire la serializzazione appropriata in modo esplicito usando la libreria ServiceStack.Text descritta di seguito.

Utilizzo di dati RESTful

I servizi Web RESTful usano in genere messaggi JSON per restituire dati al client. JSON è un formato di interscambio dati basato su testo che produce payload compatta, che comporta una riduzione dei requisiti di larghezza di banda durante l'invio di dati. In questa sezione verranno esaminati i meccanismi per l'uso di risposte RESTful in JSON e PLAIN-Old-XML (POX).

System.JSON

La piattaforma Xamarin viene fornita con supporto per JSON predefinito. Usando un JsonObjectoggetto , è possibile recuperare i risultati come illustrato nell'esempio di codice seguente:

var obj = JsonObject.Parse(json);
var properties = obj["rxtermsProperties"];
term.BrandName = properties["brandName"];
term.DisplayName = properties["displayName"];
term.Synonym = properties["synonym"];
term.FullName = properties["fullName"];
term.FullGenericName = properties["fullGenericName"];
term.Strength = properties["strength"];

È tuttavia importante tenere presente che gli System.Json strumenti caricano l'intera quantità di dati in memoria.

JSON.NET

La libreria NewtonSoft JSON.NET è una libreria ampiamente usata per serializzare e deserializzare i messaggi JSON. L'esempio di codice seguente illustra come usare JSON.NET per deserializzare un messaggio JSON in un oggetto C#:

var term = new RxTerm();
var properties = JObject.Parse(json)["rxtermsProperties"];
term.BrandName = properties["brandName"].Value<string>();
term.DisplayName = properties["displayName"].Value<string>();
term.Synonym = properties["synonym"].Value<string>();;
term.FullName = properties["fullName"].Value<string>();;
term.FullGenericName = properties["fullGenericName"].Value<string>();;
term.Strength = properties["strength"].Value<string>();
term.RxCUI = properties["rxcui"].Value<string>();

ServiceStack.Text

ServiceStack.Text è una libreria di serializzazione JSON progettata per funzionare con la libreria ServiceStack. L'esempio di codice seguente illustra come analizzare JSON usando :ServiceStack.Text.JsonObject

var result = JsonObject.Parse(json).Object("rxtermsProperties")
       .ConvertTo(x => new RxTerm {
               BrandName = x.Get("brandName"),
               DisplayName = x.Get("displayName"),
               Synonym = x.Get("synonym"),
               FullName = x.Get("fullName"),
               FullGenericName = x.Get("fullGenericName"),
               Strength = x.Get("strength"),
               RxTermDoseForm = x.Get("rxtermsDoseForm"),
               Route = x.Get("route"),
               RxCUI = x.Get("rxcui"),
               RxNormDoseForm = x.Get("rxnormDoseForm"),
       });

System.Xml.Linq

In caso di utilizzo di un servizio Web REST basato su XML, è possibile usare LINQ to XML per analizzare il codice XML e popolare un oggetto C# inline, come illustrato nell'esempio di codice seguente:

var doc = XDocument.Parse(xml);
var result = doc.Root.Descendants("rxtermsProperties")
.Select(x=> new RxTerm()
       {
               BrandName = x.Element("brandName").Value,
               DisplayName = x.Element("displayName").Value,
               Synonym = x.Element("synonym").Value,
               FullName = x.Element("fullName").Value,
               FullGenericName = x.Element("fullGenericName").Value,
               //bind more here...
               RxCUI = x.Element("rxcui").Value,
       });

servizio Web ASP.NET (ASMX)

ASMX consente di creare servizi Web che inviano messaggi usando simple object access protocol (SOAP). SOAP è un protocollo indipendente dalla piattaforma e indipendente dal linguaggio per la creazione e l'accesso ai servizi Web. I consumer di un servizio ASMX non devono conoscere nulla sulla piattaforma, sul modello a oggetti o sul linguaggio di programmazione usato per implementare il servizio. Devono solo comprendere come inviare e ricevere messaggi SOAP.

Un messaggio SOAP è un documento XML contenente gli elementi seguenti:

  • Elemento radice denominato Envelope che identifica il documento XML come messaggio SOAP.
  • Elemento Header facoltativo che contiene informazioni specifiche dell'applicazione, ad esempio i dati di autenticazione. Se l'elemento Header è presente, deve essere il primo elemento figlio dell'elemento Envelope .
  • Elemento Body obbligatorio che contiene il messaggio SOAP destinato al destinatario.
  • Elemento Fault facoltativo usato per indicare i messaggi di errore. Se l'elemento Fault è presente, deve essere un elemento figlio dell'elemento Body .

SOAP può operare su molti protocolli di trasporto, tra cui HTTP, SMTP, TCP e UDP. Tuttavia, un servizio ASMX può funzionare solo su HTTP. La piattaforma Xamarin supporta implementazioni SOAP 1.1 standard su HTTP e include il supporto per molte delle configurazioni standard del servizio ASMX.

Generazione di un proxy

È necessario generare un proxy per utilizzare un servizio ASMX, che consente all'applicazione di connettersi al servizio. Il proxy viene costruito utilizzando i metadati del servizio che definisce i metodi e la configurazione del servizio associata. Questi metadati vengono esposti come documento WSDL (Web Services Description Language) generato dal servizio Web. Il proxy viene compilato usando Visual Studio per Mac o Visual Studio per aggiungere un riferimento Web per il servizio Web ai progetti specifici della piattaforma.

L'URL del servizio Web può essere una risorsa di origine remota ospitata o file system locale accessibile tramite il prefisso del file:/// percorso, ad esempio:

file:///Users/myUserName/projects/MyProjectName/service.wsdl

The web service URL can either be a hosted remote source or local file system resource accessible via the file path prefix

In questo modo viene generato il proxy nella cartella Riferimenti al Servizio o Web del progetto. Poiché viene generato un codice proxy, non deve essere modificato.

Aggiunta manuale di un proxy a un progetto

Se si dispone di un proxy esistente generato con strumenti compatibili, questo output può essere utilizzato quando incluso come parte del progetto. In Visual Studio per Mac usare l'opzione di menu Aggiungi file per aggiungere il proxy. Inoltre, è necessario fare riferimento System.Web.Services.dll in modo esplicito usando la finestra di dialogo Aggiungi riferimenti.

Utilizzo del proxy

Le classi proxy generate forniscono metodi per l'utilizzo del servizio Web che utilizza il modello di progettazione APM (Asynchronous Programming Model). In questo modello un'operazione asincrona viene implementata come due metodi denominati BeginOperationName e EndOperationName, che iniziano e terminano l'operazione asincrona.

Il metodo BeginOperationName avvia l'operazione asincrona e restituisce un oggetto che implementa l'interfaccia IAsyncResult . Dopo aver chiamato BeginOperationName, un'applicazione può continuare a eseguire istruzioni sul thread chiamante, mentre l'operazione asincrona viene eseguita su un thread del pool di thread.

Per ogni chiamata a BeginOperationName, l'applicazione deve anche chiamare EndOperationName per ottenere i risultati dell'operazione. Il valore restituito di EndOperationName è lo stesso tipo restituito dal metodo del servizio Web sincrono. Il codice seguente ne è un esempio:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync<ASMXService.TodoItem[]> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);
  ...
}

La libreria TPL (Task Parallel Library) può semplificare il processo di utilizzo di una coppia di metodi di inizio/fine APM incapsulando le operazioni asincrone nello stesso Task oggetto. Questo incapsulamento viene fornito da più overload del Task.Factory.FromAsync metodo. Questo metodo crea un oggetto Task che esegue il TodoService.EndGetTodoItems metodo al termine del TodoService.BeginGetTodoItems metodo, con il null parametro che indica che non viene passato alcun dato al BeginGetTodoItems delegato. Infine, il valore dell'enumerazione TaskCreationOptions specifica che deve essere utilizzato il comportamento predefinito per la creazione e l'esecuzione delle attività.

Per altre informazioni su APM, vedere Modello di programmazione asincrona e TPL e Programmazione asincrona di .NET Framework tradizionale su MSDN.

Per altre informazioni sull'utilizzo di un servizio ASMX, vedere Utilizzare un servizio Web ASP.NET (ASMX).

Windows Communication Foundation (WCF)

WCF è il framework unificato di Microsoft per la creazione di applicazioni orientate ai servizi. Consente agli sviluppatori di creare applicazioni distribuite sicure, affidabili, transazioni e interoperabili.

WCF descrive un servizio con un'ampia gamma di contratti diversi che includono quanto segue:

  • Contratti dati: definire le strutture di dati che costituiscono la base per il contenuto all'interno di un messaggio.
  • Contratti di messaggio: comporre messaggi da contratti dati esistenti.
  • Contratti di errore: consente di specificare errori SOAP personalizzati.
  • Contratti di servizio: specificare le operazioni supportate dai servizi e i messaggi necessari per interagire con ogni operazione. Specificano anche qualsiasi comportamento di errore personalizzato che può essere associato alle operazioni in ogni servizio.

Esistono differenze tra ASP.NET Servizi Web (ASMX) e WCF, ma è importante comprendere che WCF supporta le stesse funzionalità offerte da ASMX, ovvero messaggi SOAP su HTTP.

Importante

Il supporto della piattaforma Xamarin per WCF è limitato ai messaggi SOAP codificati in testo su HTTP/HTTPS usando la BasicHttpBinding classe . Inoltre, il supporto wcf richiede l'uso di strumenti disponibili solo in un ambiente Windows per generare il proxy.

Generazione di un proxy

È necessario generare un proxy per utilizzare un servizio WCF, che consente all'applicazione di connettersi al servizio. Il proxy viene costruito utilizzando i metadati del servizio che definiscono i metodi e la configurazione del servizio associata. Questi metadati vengono esposti sotto forma di documento WSDL (Web Services Description Language) generato dal servizio Web. Il proxy può essere compilato usando il provider di riferimento del servizio Web WCF Microsoft in Visual Studio 2017 per aggiungere un riferimento al servizio Web a una libreria .NET Standard.

Un'alternativa alla creazione del proxy tramite il provider di riferimento del servizio Web WCF Microsoft in Visual Studio 2017 consiste nell'usare lo strumento utilità metadati ServiceModel (svcutil.exe). Per altre informazioni, vedere ServiceModel Metadata Utility Tool (Svcutil.exe).For more information, see ServiceModel Metadata Utility Tool (Svcutil.exe).

Configurazione del proxy

La configurazione del proxy generato accetta in genere due argomenti di configurazione (a seconda di SOAP 1.1/ASMX o WCF) durante l'inizializzazione: le EndpointAddress informazioni di associazione e/o associate, come illustrato nell'esempio seguente:

var binding = new BasicHttpBinding () {
       Name= "basicHttpBinding",
       MaxReceivedMessageSize = 67108864,
};

binding.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas() {
       MaxArrayLength = 2147483646,
       MaxStringContentLength = 5242880,
};

var timeout = new TimeSpan(0,1,0);
binding.SendTimeout= timeout;
binding.OpenTimeout = timeout;
binding.ReceiveTimeout = timeout;

client = new Service1Client (binding, new EndpointAddress ("http://192.168.1.100/Service1.svc"));

Un'associazione viene usata per specificare i dettagli del trasporto, della codifica e del protocollo necessari per comunicare tra applicazioni e servizi. BasicHttpBinding Specifica che i messaggi SOAP codificati in testo verranno inviati tramite il protocollo di trasporto HTTP. Se si specifica un indirizzo endpoint, l'applicazione può connettersi a istanze diverse del servizio WCF, purché siano presenti più istanze pubblicate.

Utilizzo del proxy

Le classi proxy generate forniscono metodi per l'utilizzo dei servizi Web che usano il modello di progettazione APM (Asynchronous Programming Model). In questo modello, un'operazione asincrona viene implementata come due metodi denominati BeginOperationName e EndOperationName, che iniziano e terminano l'operazione asincrona.

Il metodo BeginOperationName avvia l'operazione asincrona e restituisce un oggetto che implementa l'interfaccia IAsyncResult . Dopo aver chiamato BeginOperationName, un'applicazione può continuare a eseguire istruzioni sul thread chiamante, mentre l'operazione asincrona viene eseguita su un thread del pool di thread.

Per ogni chiamata a BeginOperationName, l'applicazione deve anche chiamare EndOperationName per ottenere i risultati dell'operazione. Il valore restituito di EndOperationName è lo stesso tipo restituito dal metodo del servizio Web sincrono. Il codice seguente ne è un esempio:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);
  ...
}

La libreria TPL (Task Parallel Library) può semplificare il processo di utilizzo di una coppia di metodi di inizio/fine APM incapsulando le operazioni asincrone nello stesso Task oggetto. Questo incapsulamento viene fornito da più overload del Task.Factory.FromAsync metodo. Questo metodo crea un oggetto Task che esegue il TodoServiceClient.EndGetTodoItems metodo al termine del TodoServiceClient.BeginGetTodoItems metodo, con il null parametro che indica che non viene passato alcun dato al BeginGetTodoItems delegato. Infine, il valore dell'enumerazione TaskCreationOptions specifica che deve essere utilizzato il comportamento predefinito per la creazione e l'esecuzione delle attività.

Per altre informazioni su APM, vedere Modello di programmazione asincrona e TPL e Programmazione asincrona di .NET Framework tradizionale su MSDN.

Per altre informazioni sull'utilizzo di un servizio WCF, vedere Utilizzare un servizio Web Windows Communication Foundation (WCF).

Uso della sicurezza del trasporto

I servizi WCF possono usare la sicurezza a livello di trasporto per proteggersi dall'intercettazione dei messaggi. La piattaforma Xamarin supporta associazioni che usano la sicurezza a livello di trasporto tramite SSL. Tuttavia, potrebbero verificarsi casi in cui lo stack potrebbe dover convalidare il certificato, con un comportamento imprevisto. La convalida può essere sottoposta a override registrando un ServerCertificateValidationCallback delegato prima di richiamare il servizio, come illustrato nell'esempio di codice seguente:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) => { return true; };

Questa operazione mantiene la crittografia del trasporto ignorando la convalida del certificato lato server. Tuttavia, questo approccio ignora efficacemente i problemi di attendibilità associati al certificato e potrebbe non essere appropriato. Per altre informazioni, vedere Uso rispettoso delle radici attendibili su mono-project.com.

Uso della sicurezza delle credenziali client

I servizi WCF possono anche richiedere che i client del servizio eseguano l'autenticazione usando le credenziali. La piattaforma Xamarin non supporta il protocollo WS-Security, che consente ai client di inviare le credenziali all'interno della busta del messaggio SOAP. Tuttavia, la piattaforma Xamarin supporta la possibilità di inviare le credenziali di autenticazione di base HTTP al server specificando quanto appropriato ClientCredentialType:

basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

È quindi possibile specificare le credenziali di autenticazione di base:

client.ClientCredentials.UserName.UserName = @"foo";
client.ClientCredentials.UserName.Password = @"mrsnuggles";

Per altre informazioni sull'autenticazione di base HTTP, anche se nel contesto di un servizio Web REST, vedere Autenticazione di un servizio Web RESTful.