Tutti gli esempi proposti questa guida facevano riferimento ad un Web server che ospita l'applicazione, sia esso il server integrato in Visual Studio che IIS. ASP.NET Web API prevede però anche la possibilità di essere indipendente da qualsiasi Web server, consentendo l'esecuzione all'interno di un processo di un'applicazione Windows grazie al meccanismo di self-hosting.
Vediamo in questa sezione come sfruttare questa caratteristica creando un'applicazione stand-alone che ospita le Web API del nostro glossario.
Iniziamo con la creazione da Visual Studio di un progetto di tipo console:
Assicuriamoci che il framework di riferimento sia .NET Framework 4.0 e non .NET Framework 4.0 Client Profile, altrimenti non saremmo in grado di utilizzare ASP.NET.
Aggiungiamo al progetto i riferimenti agli assembly necessari per utilizzare ASP.NET Self Host. Il modo più semplice è quello di utilizzare NuGet per installare e configurare tutto quello che occorre. In particolare con NuGet dobbiamo ricercare ed installare il pacchetto Microsoft.AspNet.WebApi.SelfHost.
A questo punto il nostro progetto è pronto per poter realizzare le Web API del nostro glossario in modalità self host. Possiamo quindi creare le risorse ed i controller nello stesso modo in cui li abbiamo creati per la versione ospitata da un Web server.
Perchè tutto funzioni, però, abbiamo la necessità di effettuare alcune impostazioni nel metodo Main() della classe Program:
public static void Main(string[] args)
{
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("Il server è in esecuzione.");
Console.WriteLine("Premere Invio per uscire.");
Console.ReadLine();}
}
Per prima cosa creiamo un'istanza della classe HttpSelfHostConfiguration passando l'URL base a cui il nostro server sarà raggiungibile, specificando anche l'eventuale porta di ascolto. Nel nostro esempio abbiamo specificato la porta 8080, ma se non specifichiamo alcuna porta il server risponderà sulla porta standard 80.
L'istanza così creata ci consente di specificare la route delle nostre risorse Web e di tutte quelle impostazioni che finora abbiamo visto configurare in corrispondenza del metodo Application_Start()
in Global.asax
.
Creiamo quindi un'istanza del server tramite la classe HttpSelfHostServer passandogli le impostazioni della nostra API. Quindi lanciamo in maniera asincrona il task associato e rimaniamo in attesa.
Possiamo a questo punto interrogare la nostra applicazione con un qualsiasi client RESTful come se si trattasse di una Web API ospitata da un Web server.
Come nota finale per l'esecuzione di una Web API self hosted segnaliamo che per l'ascolto su una porta TCP potrebbero essere richiesti i diritti di amministratore.