Windows Dev Center

Come connettersi tramite System.Net.Http.HttpClient (app di Windows Store in C#/VB e XAML)

Usa la classe HttpClient nello spazio dei nomi System.Net.Http per inviare una richiesta GET a un servizio Web e recuperare la risposta.

Nota  Gli spazi dei nomi System.Net.Http e System.Net.Http.Headers potrebbero non essere disponibili nelle versioni future di Windows per l'uso in app di Windows Store. A partire da Windows 8.1 e Windows Server 2012 R2, per le app di Windows Runtime usa invece Windows.Web.Http.HttpClient nello spazio dei nomi Windows.Web.Http e negli spazi dei nomi correlati Windows.Web.Http.Headers e Windows.Web.Http.Filters.

Le classi nello spazio dei nomi System.Net.Http offrono un'interfaccia di programmazione per le app HTTP moderne. Lo spazio dei nomi System.Net.Http e lo spazio dei nomi correlato forniscono componenti client HTTP che consentono agli utenti di usare i servizi Web moderni tramite HTTP.

La classe System.Net.Http.HttpClient viene usata per inviare e ricevere richieste di base tramite HTTP. Fornisce una classe base per inviare richieste HTTP e ricevere risposte HTTP da una risorsa identificata da un URI. Questa classe può essere usata per inviare richieste GET, PUT, POST, DELETE e di altro tipo a un servizio Web. Ognuna di queste richieste viene inviata in modo asincrono.

La classe System.Net.Http.HttpResponseMessage rappresenta un messaggio di risposta HTTP ricevuto da una richiesta HTTP. I messaggi HTTP sono definiti nella RFC 2616 da IETF.

La classe System.Net.Http.HttpContent è una classe di base che rappresenta il corpo e le intestazioni del contenuto di un'entità HTTP. In questo caso, la classe System.Net.Http.Http.Content viene usata per rappresentare la risposta HTTP.

Prerequisiti

Gli esempi contenuti in questo argomento sono scritti in C# mediante .NET Framework 4.5. È necessaria una conoscenza di base delle richieste HTTP descritte nella RFC 2616 per comprendere questo esempio.

Per eseguire richieste HTTP in un'app di Windows Runtime sviluppata con C#, Visual Basic o XAML, vedi Come connettersi a un server HTTP tramite Windows.Web.Http.HttpClient. Per eseguire richieste HTTP in un'app di Windows Runtime sviluppata con C++ e XAML, vedi Come connettersi a un server HTTP tramite Windows.Web.Http.HttpClient e Come connettersi con richieste estese XML HTTP e IXMLHTTPRequest2.

Per effettuare richieste HTTP in un'app di Windows Runtime con JavaScript e HTML, vedi Connessione a servizi Web (HTML).

Creare un nuovo progetto

  1. Apri Microsoft Visual Studio 2013 e scegli Nuovo progetto dal menu File.
  2. Nell'elenco dei modelli seleziona Visual C#.
  3. Nella sezione scegli Applicazioni Windows Store.
  4. Nella sezione seleziona Applicazioni Windows e quindi Applicazione vuota.
  5. Assegna all'applicazione il nome HttpClientBasic e fai clic su OK.

Impostare le funzionalità per abilitare l'accesso in rete

Per consentire alla tua app di accedere a una rete privata domestica o aziendale e a Internet, devi impostare le funzionalità di rete. Per questa app devi abilitare le funzionalità di rete in quanto il client si connette a servizi Web.

Le app che usano System.Net.Http.HttpClient per connettersi a un servizio Web su un computer diverso richiedono l'impostazione delle funzionalità di rete. Se l'app deve essere in grado di connettersi come client a servizi Web in Internet, è necessaria la funzionalità Internet (client). Se l'app deve essere in grado di connettersi come client a servizi Web su una rete di casa o di lavoro, è necessaria la funzionalità Reti private (client e server).

Se il servizio Web è in esecuzione nello stesso computer dell'app, sarà necessario l'accesso loopback. Le app sviluppate in Microsoft Visual Studio 2012 verranno registrate automaticamente come esenti dalle restrizioni loopback. Per altre informazioni, vedi Come abilitare il loopback ed eseguire il debug dell'isolamento di rete.

Per altre informazioni sull'accesso di rete, vedi Come configurare le funzionalità di isolamento della rete.

I passaggi seguenti non sono necessari per questo esempio se il servizio Web è nel computer locale. Questi passaggi sono necessari per impostare le funzionalità di rete per l'app in caso di accesso a un servizio Web su Internet o a una rete privata o aziendale.

  1. Usa Visual Studio 2012 per aprire il file package.appxmanifest.
  2. Fai clic sulla scheda Funzionalità.
  3. Seleziona le funzionalità Internet (client) e Reti private (client e server).
  4. Salva e chiudi il file manifesto.

Aggiungere l'interfaccia utente XAML

  • In questa sezione definiremo il layout dell'app in XAML per specificare le dimensioni e la posizione di ogni oggetto nell'app. L'interfaccia utente per l'app verrà completata con l'aggiunta di controlli e contenuto per la visualizzazione dei dati.

    Questo esempio usa semplici elementi di interfaccia utente XAML, inclusi i seguenti:

    • Un controllo orizzontale StackPanel che contiene un controllo TextBlock per un'etichetta, un controllo TextBox per l'indirizzo URI di input e un controllo Button usato per avviare la richiesta asincrona.
    • Un controllo orizzontale StackPanel che contiene un controllo TextBlock per un'etichetta e un controllo TextBox per lo stato corrente. Questa è la posizione in cui verranno visualizzati i messaggi di stato e di errore.

    Un controllo Grid per la visualizzazione dell'output ricevuto dal servizio Web. In questo esempio, il risultato dell'operazione HTTP GET è visualizzato come testo normale che contiene il markup HTML.

    Apri la cartella cs. Apri il file blankPage.html esistente e rinominalo in MainPage.xaml. Aggiungi gli elementi di interfaccia utente seguenti a questo file.

    
    <Page
        x:Class="HttpClientBasic.BlankPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:HttpClientBasic"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="URI Address:" FontSize="16" Height="20"  Margin="15,0,0,0" />
                    <TextBox x:Name="InputAddress" Text="http://www.contoso.com" FontSize="16" Height="20" Margin="15,0,0,0" />
                    <Button Content="Start" Click="Start_Click" Margin="280,0,0,0" />
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Status:" FontSize="16" Height="20" Margin="15,0,0,0" />
                    <TextBox x:Name="StatusText" Text="Idle" FontSize="16" Height="Auto" TextWrapping="Wrap" Margin="15,0,0,0" />
                </StackPanel>
                <Grid 
                    Grid.Column="1" Margin="15,0,0,0">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <TextBlock x:Name="OutputView" FontSize="16" Height="Auto" Margin="15,0,0,0" TextWrapping="Wrap" />
                </Grid>    
            </StackPanel>
         </Grid>
    </Page>
    
    
    

Creare HttpClient, inviare la richiesta GET e recuperare la risposta

Il codice seguente crea prima di tutto un oggetto System.Net.Http.HttpClient.

  1. Prima crea l'oggetto HttpClient. Impostiamo anche due proprietà per l'oggetto HttpClient.

    La dimensione predefinita della proprietà HttpClient.MaxResponseContentBufferSize corrisponde alla dimensione massima di un numero intero. Per limitare la quantità di dati accettati dall'app come risposta dal servizio Web, impostiamo questa proprietà su un valore più basso.

    Per impostazione predefinita, l'oggetto HttpClient non invia nessuna intestazione utente agente con la richiesta HTTP al servizio Web. Alcuni server HTTP, inclusi alcuni server Web Microsoft, richiedono che un'intestazione utente agente sia inclusa con la richiesta HTTP inviata dal client e restituiscono un errore se l'intestazione non è presente. Per evitare questi errori, viene aggiunta un'intestazione utente agente tramite la proprietà HttpClient.DefaultRequestHeaders.

    Apri la cartella cs. Apri il file MainPage.cs e aggiungi il codice seguente al file.

    
        private HttpClient httpClient;
    
        public BlankPage()
        {
            this.InitializeComponent();
            httpClient = new HttpClient();
            // Limit the max buffer size for the response so we don't get overwhelmed
            httpClient.MaxResponseContentBufferSize = 256000;
            httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
        }
    
    
    
  2. Invia la richiesta GET e recupera la risposta.

    La maggior parte del lavoro viene svolta nel gestore del clic per il controllo Button Start. Quando il pulsante viene scelto, il testo negli elementi dell'interfaccia utente StatusText e OutputView viene aggiornato e quindi si usa l'indirizzo URI di input per inviare la richiesta HTTP GET e attendere la risposta. Se si verifica un errore o un'eccezione, il risultato viene visualizzato nell'elemento dell'interfaccia utente StatusText. Se non si verificano errori, la risposta proveniente dal servizio Web viene visualizzata nell'elemento dell'interfaccia utente OutputView.

    Con la parola chiave await in C# e Visual Basic, il codice per l'invio della richiesta GET e il recupero della risposta in modo asincrono è simile a quello che dovremmo usare per eseguire l'operazione in modo sincrono. Puoi usare la parola chiave await solo se il metodo è definito come async.

    Il metodo HttpResponseMessage.EnsureSuccessStatusCode genera un'eccezione se il server Web restituisce un codice di stato di errore HTTP. Usa un blocco try/catch per qualsiasi eccezione e stampa il messaggio dell'eccezione nell'elemento StatusText dell'interfaccia utente se si verifica un errore. Nel blocco try, stampa lo stato e la risposta restituiti dal servizio Web.

    La proprietà HttpResponseMessage.Content rappresenta il contenuto della risposta HTTP. Il metodo HttpContent.ReadAsStringAsync scrive il contenuto HTTP in una stringa come operazione asincrona. Sostituiamo gli eventuali tag <br> nel testo HTML restituito con nuove righe per una visualizzazione ottimale.

    
            private async void Start_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    string responseBodyAsText;
                    OutputView.Text = "";
                    StatusText.Text = "Waiting for response ...";
    
                    HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
                    response.EnsureSuccessStatusCode();
    
                    StatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
                    responseBodyAsText = await response.Content.ReadAsStringAsync();
                    responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines
                    OutputView.Text = responseBodyAsText;
                }
                catch (HttpRequestException hre)
                {
                    StatusText.Text = hre.ToString();
                }
                catch (Exception ex)
                {
                    // For debugging
                    StatusText.Text = ex.ToString();
                }
            }
    
    
    
    

    Se un'app che usa HttpClient e le classi correlate nello spazio dei nomi System.Net.Http è progettata per scaricare grandi quantità di dati (almeno 50 MB), deve trasmettere questi download in flussi anziché usare il buffering predefinito. Se viene usato il buffering predefinito, verrà consumata una notevole quantità di memoria del client, con la potenziale conseguenza di una riduzione sostanziale delle prestazioni.

    L'eccezione UriFormatException viene generata quando viene rilevato un URI (Uniform Resource Identifier) non valido dai membri della classe HttpClient e delle classi correlate. Questa eccezione non è disponibile per l'uso nelle app di Windows Store. Per intercettare questa eccezione in questo caso, scrivi un'istruzione catch per FormatException.

Riepilogo e passaggi successivi

In questo argomento abbiamo esaminato come usare la classe System.Net.Http.HttpClient per inviare una richiesta GET a un servizio Web e recuperare la risposta usando le classi System.Net.Http.HttpResponseMessage e System.Net.Http.HttpContent.

Esempio di HttpClientBasic


using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?linkid=234238

namespace HttpClientBasic
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class BlankPage : Page
    {
        private HttpClient httpClient;

        public BlankPage()
        {
            this.InitializeComponent();
            httpClient = new HttpClient();
            // Limit the max buffer size for the response so we don't get overwhelmed
            httpClient.MaxResponseContentBufferSize = 256000;
            httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
        }


        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private async void Start_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string responseBodyAsText;
                OutputView.Text = "";
                StatusText.Text = "Waiting for response ...";

                HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
                response.EnsureSuccessStatusCode();

                StatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
                responseBodyAsText = await response.Content.ReadAsStringAsync();
                responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines
                OutputView.Text = responseBodyAsText;
            }
            catch (HttpRequestException hre)
            {
                StatusText.Text = hre.ToString();
            }
            catch (Exception ex)
            {
                // For debugging
                StatusText.Text = ex.ToString();
            }
        }
    }
}


La classe System.Net.Http.HttpClientHandler può essere usata con la classe System.Net.Http.HttpClient per impostare le opzioni della richiesta HTTP. Per ulteriori informazioni, vedi Come usare i gestori System.Net.Http.HttpClient.

Argomenti correlati

Altre risorse
Connessione a servizi Web
Come configurare le funzionalità di rete
Come connettersi a un server HTTP tramite Windows.Web.Http.HttpClient
Come abilitare il loopback ed eseguire il debug dell'isolamento di rete
Come proteggere le connessioni System.Net.Http.HttpClient
Come usare i gestori System.Net.Http.HttpClient
Riferimento
System.Net.Http
System.Net.Http.Headers
Windows.Web.Http
Windows.Web.Http.Filters
Windows.Web.Http.Headers
Esempi
Esempio di HttpClient

 

 

Mostra:
© 2015 Microsoft