Self-Host API Web ASP.NET 1 (C#)

di Mike Wasson

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

Le nuove applicazioni devono usare OWIN per l'API Web self-host. Vedere Usare OWIN per Self-Host API Web ASP.NET 2.

Versioni software usate nell'esercitazione

  • API Web 1
  • Visual Studio 2012

Creare il progetto dell'applicazione console

Avviare Visual Studio e selezionare Nuovo progetto nella pagina Start . 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 un nome al progetto "SelfHost" e fare clic su OK.

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

Impostare Target Framework (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 dot NET Framework 4, 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. Avviare 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 installare.
  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, evidenziati in grigio.

Aggiungere il pacchetto NuGet dell'API Web

Dopo l'installazione di Gestione pacchetti NuGet, aggiungere il pacchetto dell'API Web Self-Host al progetto.

  1. Dal menu Strumenti selezionare Gestione pacchetti NuGet. Nota: se non viene visualizzata questa voce di menu, 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 API Web ASP.NET e fare clic su Installa.
  6. Dopo aver installato il pacchetto, fare clic su Chiudi per chiudere la finestra di dialogo.

Nota

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

Screenshot della finestra di dialogo Gestisci pacchetti NuGet che mostra Microsoft A P dot Net Web A P A Self Host, evidenziata in blu.

Creare il modello e il controller

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

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 Introduzione. Questo controller definisce tre azioni GET:

URI 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 è in ascolto di http://localhost:8080/. Per impostazione predefinita, l'ascolto di un indirizzo HTTP specifico richiede privilegi di amministratore. Quando si esegue l'esercitazione, è quindi 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 o
  • 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 dell'self-hosting, assicurarsi di eliminare la prenotazione:

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

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

Scriviamo un'applicazione console semplice 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 della Esplora soluzioni che mostra le voci di menu Aggiungi e Nuovo progetto con il pulsante destro del mouse, evidenziate in bianco.

Usare Gestione pacchetti NuGet per aggiungere il pacchetto API Web ASP.NET Librerie di base:

  • Dal menu Strumenti selezionare Gestione pacchetti NuGet.
  • 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 di Microsoft API Web 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 selezionare Progetti in Soluzione.
  • 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 statica di HttpClient :

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 e elencare i prodotti in base alla 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. Ottenere la proprietà Result blocca il thread fino al completamento dell'operazione.

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

Prima di chiamare questi metodi, impostare la proprietà BaseAddress nell'istanza di HttpClient su "http://localhost:8080". Ad 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();
}

Questa operazione deve restituire quanto segue. Tenere presente 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 restituiti associati a I D e categorie.