Condividi tramite


Hosting autonomo dell'API web ASP.NET 1 (C#)

di Mike Wasson

Questa esercitazione illustra come ospitare un'API Web all'interno di un'applicazione console. ASP.NET'API Web non richiede IIS. È possibile ospitare autonomamente un'API Web nel proprio processo host.

Le nuove applicazioni dovrebbero usare OWIN per auto-ospitare l'API Web. Consulta Usare OWIN per auto-ospitare ASP.NET Web API 2.

Versioni software usate nell'esercitazione

  • API Web 1
  • Visual Studio 2012

Creare il progetto di applicazione console

Avviare Visual Studio e selezionare Nuovo progetto nella pagina Iniziale . In alternativa, dal menu File, selezionare Nuovo e quindi Progetto.

Nel riquadro Modelli selezionare Modelli installati ed espandere il nodo Visual C# . In Visual C# selezionare Windows. Nell'elenco dei modelli di progetto selezionare Applicazione console. Assegnare al progetto il nome "SelfHost" e fare clic su OK.

Screenshot della finestra di dialogo Nuovo progetto che mostra l'elemento Visual C# nell'elenco di cartelle e l'elemento Applicazione Windows Form, evidenziato in grigio.

Impostare Il framework di destinazione (Visual Studio 2010)

Se si usa Visual Studio 2010, modificare il framework di destinazione in .NET Framework 4.0. Per impostazione predefinita, il modello di progetto è destinato al profilo client .Net Framework.

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà. Nell'elenco a discesa Framework di destinazione modificare il framework di destinazione in .NET Framework 4.0. Quando viene richiesto di applicare la modifica, fare clic su .

Screenshot della finestra Esplora soluzioni che mostra l'elenco a discesa Framework di destinazione con l'elemento .NET Framework 4 che è evidenziato in blu.

Installare Gestione pacchetti NuGet

Gestione pacchetti NuGet è il modo più semplice per aggiungere gli assembly API Web a un progetto di non-ASP.NET.

Per verificare se Gestione pacchetti NuGet è installato, fare clic sul menu Strumenti in Visual Studio. Se viene visualizzata una voce di menu denominata Gestione pacchetti NuGet, si dispone di Gestione pacchetti NuGet.

Per installare Gestione pacchetti NuGet:

  1. Avvia Visual Studio.
  2. Scegliere Estensioni e aggiornamenti dal menu Strumenti.
  3. Nella finestra di dialogo Estensioni e aggiornamenti selezionare Online.
  4. Se non viene visualizzato "Gestione pacchetti NuGet", digitare "gestione pacchetti nuget" nella casella di ricerca.
  5. Selezionare Gestione pacchetti NuGet e fare clic su Scarica.
  6. Al termine del download, verrà richiesto di eseguire l'installazione.
  7. Al termine dell'installazione, potrebbe essere richiesto di riavviare Visual Studio.

Screenshot della finestra di dialogo Estensioni e aggiornamenti che mostra Gestione pacchetti NuGet nei risultati della ricerca, evidenziato in grigio.

Aggiungere il pacchetto NuGet dell'API Web

Dopo aver installato NuGet Package Manager, aggiungere il pacchetto Web API Self-Host al tuo progetto.

  1. Scegliere Gestione pacchetti NuGet dal menu Strumenti. Nota: se questa voce di menu non viene visualizzata, assicurarsi che Gestione pacchetti NuGet sia installato correttamente.
  2. Selezionare Gestisci pacchetti NuGet per la soluzione
  3. Nella finestra di dialogo Gestisci pacchetti NugGet selezionare Online.
  4. Nella casella di ricerca digitare "Microsoft.AspNet.WebApi.SelfHost".
  5. Selezionare il pacchetto self host dell'API Web ASP.NET e fare clic su Installa.
  6. Dopo l'installazione del pacchetto, fare clic su Chiudi per chiudere la finestra di dialogo.

Annotazioni

Assicurarsi di installare il pacchetto denominato Microsoft.AspNet.WebApi.SelfHost, non AspNetWebApi.SelfHost.

Screenshot della finestra di dialogo Gestisci pacchetti NuGet che mostra Microsoft ASP.NET Web API Self Host, evidenziato in blu.

Creare il modello e il controller

Questa esercitazione usa le stesse classi di modello e controller dell'esercitazione introduttiva .

Aggiungere una classe pubblica denominata Product.

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

Aggiungere una classe pubblica denominata ProductsController. Derivare questa classe da System.Web.Http.ApiController.

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

Per altre informazioni sul codice in questo controller, vedere l'esercitazione Guida introduttiva. Questo controller definisce tre azioni GET:

URI (Identificatore Uniforme delle Risorse) Descrizione
/api/products Ottenere un elenco di tutti i prodotti.
/api/products/id Ottenere un prodotto in base all'ID.
/api/products/?category=category Ottenere un elenco di prodotti per categoria.

Ospitare l'API Web

Aprire il file Program.cs e aggiungere le istruzioni 'using' seguenti:

using System.Web.Http;
using System.Web.Http.SelfHost;

Aggiungere il codice seguente alla classe Program .

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

(Facoltativo) Aggiungere una prenotazione dello spazio dei nomi URL HTTP

Questa applicazione ascolta http://localhost:8080/. Per impostazione predefinita, l'ascolto su un indirizzo HTTP specifico richiede privilegi di amministratore. Quando si esegue l'esercitazione, pertanto, è possibile che venga visualizzato questo errore: "HTTP non è riuscito a registrare l'URL http://+:8080/" Esistono due modi per evitare questo errore:

  • Eseguire Visual Studio con autorizzazioni di amministratore elevate oppure
  • Usare Netsh.exe per concedere all'account le autorizzazioni per riservare l'URL.

Per usare Netsh.exe, aprire un prompt dei comandi con privilegi di amministratore e immettere il comando seguente:

netsh http add urlacl url=http://+:8080/ user=machine\username

dove machine\username è l'account utente.

Al termine del self-hosting, assicurati di eliminare la prenotazione:

netsh http delete urlacl url=http://+:8080/

Chiamare l'API Web da un'applicazione client (C#)

Si scriverà una semplice applicazione console che chiama l'API Web.

Aggiungere un nuovo progetto di applicazione console alla soluzione:

  • In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Aggiungi nuovo progetto.
  • Creare una nuova applicazione console denominata "ClientApp".

Screenshot di Esplora soluzioni che mostra le voci di menu Aggiungi e Nuovo progetto, evidenziate in bianco.

Usare Gestione pacchetti NuGet per aggiungere il pacchetto delle librerie principali dell'API Web ASP.NET:

  • Scegliere Gestione pacchetti NuGet dal menu Strumenti.
  • Selezionare Gestisci pacchetti NuGet per la soluzione
  • Nella finestra di dialogo Gestisci pacchetti NuGet selezionare Online.
  • Nella casella di ricerca digitare "Microsoft.AspNet.WebApi.Client".
  • Selezionare il pacchetto Librerie client dell'API Web di Microsoft ASP.NET e fare clic su Installa.

Aggiungere un riferimento in ClientApp al progetto SelfHost:

  • In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ClientApp.
  • Selezionare Aggiungi riferimento.
  • Nella finestra di dialogo Gestione riferimenti , in Soluzione, selezionare Progetti.
  • Selezionare il progetto SelfHost.
  • Fare clic su OK.

Screenshot della finestra di dialogo Gestione riferimenti che mostra il progetto Self Host, evidenziato con una casella blu.

Aprire il file Client/Program.cs. Aggiungere l'istruzione using seguente:

using System.Net.Http;

Aggiungere un'istanza httpClient statica:

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

Aggiungere i metodi seguenti per elencare tutti i prodotti, elencare un prodotto in base all'ID ed elencare i prodotti per categoria.

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

Ognuno di questi metodi segue lo stesso modello:

  1. Chiamare HttpClient.GetAsync per inviare una richiesta GET all'URI appropriato.
  2. Chiamare HttpResponseMessage.EnsureSuccessStatusCode. Questo metodo genera un'eccezione se lo stato della risposta HTTP è un codice di errore.
  3. Chiamare ReadAsAsync<T> per deserializzare un tipo CLR dalla risposta HTTP. Questo metodo è un metodo di estensione, definito in System.Net.Http.HttpContentExtensions.

I metodi GetAsync e ReadAsAsync sono entrambi asincroni. Restituiscono oggetti Task che rappresentano l'operazione asincrona. Il recupero della proprietà Result blocca il thread fino al completamento dell'operazione.

Per altre informazioni sull'uso di HttpClient, tra cui come effettuare chiamate senza blocco, vedere Chiamata di un'API Web da un client .NET.

Prima di chiamare questi metodi, impostare la proprietà BaseAddress nell'istanza HttpClient su "http://localhost:8080". Per esempio:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

L'output dovrebbe essere il seguente. Ricordarsi di eseguire prima l'applicazione SelfHost.

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

Screenshot della finestra della console che mostra un elenco di prodotti generato associati a ID e categorie.