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

von Mike Wasson

In diesem Tutorial erfahren Sie, wie Sie eine Web-API in einer Konsolenanwendung hosten. ASP.NET-Web-API erfordert keine IIS. Sie können eine Web-API in Ihrem eigenen Hostprozess selbst hosten.

Neue Anwendungen sollten OWIN verwenden, um die Web-API selbst zu hosten. Weitere Informationen finden Sie unter Verwenden von OWIN für Self-Host ASP.NET-Web-API 2.

Im Tutorial verwendete Softwareversionen

  • Web-API 1
  • Visual Studio 2012

Erstellen des Konsolenanwendungsprojekts

Starten Sie Visual Studio, und wählen Sie Neues Projektauf der Startseite aus. Oder wählen Sie im Menü Datei die Option Neu und dann Projekt aus.

Wählen Sie im Bereich Vorlagendie Option Installierte Vorlagen aus, und erweitern Sie den Knoten Visual C# . Wählen Sie unter Visual C#die Option Windows aus. Wählen Sie in der Liste der Projektvorlagen konsolenanwendung aus. Nennen Sie das Projekt "SelfHost", und klicken Sie auf OK.

Screenshot des Dialogfelds

Festlegen des Zielframeworks (Visual Studio 2010)

Wenn Sie Visual Studio 2010 verwenden, ändern Sie das Zielframework in .NET Framework 4.0. (Standardmäßig zielt die Projektvorlage auf das .NET Framework-Clientprofil ab.)

Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Eigenschaften aus. Ändern Sie in der Dropdownliste Zielframework das Zielframework in .NET Framework 4.0. Wenn Sie aufgefordert werden, die Änderung anzuwenden, klicken Sie auf Ja.

Screenshot des fensters

Installieren des NuGet-Paket-Managers

Der NuGet-Paket-Manager ist die einfachste Möglichkeit, die Web-API-Assemblys einem non-ASP.NET-Projekt hinzuzufügen.

Um zu überprüfen, ob der NuGet-Paket-Manager installiert ist, klicken Sie in Visual Studio auf das Menü Extras . Wenn ein Menüelement namens NuGet-Paket-Manager angezeigt wird, verfügen Sie über den NuGet-Paket-Manager.

So installieren Sie den NuGet-Paket-Manager:

  1. Starten Sie Visual Studio.
  2. Wählen Sie im Menü Extras die Option Erweiterungen und Updates aus.
  3. Wählen Sie im Dialogfeld Erweiterungen und Updatesdie Option Online aus.
  4. Wenn "NuGet-Paket-Manager" nicht angezeigt wird, geben Sie "nuget-Paket-Manager" in das Suchfeld ein.
  5. Wählen Sie den NuGet-Paket-Manager aus, und klicken Sie auf Herunterladen.
  6. Nach Abschluss des Downloads werden Sie zur Installation aufgefordert.
  7. Nach Abschluss der Installation werden Sie möglicherweise aufgefordert, Visual Studio neu zu starten.

Screenshot des Dialogfelds

Hinzufügen des Web-API-NuGet-Pakets

Fügen Sie nach der Installation des NuGet-Paket-Managers dem Projekt das Web-API-Self-Host-Paket hinzu.

  1. Wählen Sie im Menü Extras die Option NuGet-Paket-Manager aus. Hinweis: Wenn dieses Menüelement nicht angezeigt wird, stellen Sie sicher, dass der NuGet-Paket-Manager ordnungsgemäß installiert ist.
  2. Wählen Sie NuGet-Pakete für Projektmappe verwalten aus.
  3. Wählen Sie im Dialogfeld NugGet-Pakete verwalten die Option Online aus.
  4. Geben Sie im Suchfeld "Microsoft.AspNet.WebApi.SelfHost" ein.
  5. Wählen Sie das ASP.NET-Web-API Selbsthostpaket aus, und klicken Sie auf Installieren.
  6. Klicken Sie nach der Installation des Pakets auf Schließen , um das Dialogfeld zu schließen.

Hinweis

Stellen Sie sicher, dass Sie das Paket mit dem Namen Microsoft.AspNet.WebApi.SelfHost und nicht AspNetWebApi.SelfHost installieren.

Screenshot des Dialogfelds

Erstellen des Modells und des Controllers

In diesem Tutorial werden die gleichen Modell- und Controllerklassen wie das Erste Schritte-Tutorial verwendet.

Fügen Sie eine öffentliche Klasse mit dem Namen hinzu 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; }
    }
}

Fügen Sie eine öffentliche Klasse mit dem Namen hinzu ProductsController. Leiten Sie diese Klasse von System.Web.Http.ApiController ab.

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));
        }
    }
}

Weitere Informationen zum Code in diesem Controller finden Sie im Tutorial Erste Schritte. Dieser Controller definiert drei GET-Aktionen:

URI BESCHREIBUNG
/api/products Rufen Sie eine Liste aller Produkte ab.
/api/products/id Rufen Sie ein Produkt nach ID ab.
/api/products/?category=category Rufen Sie eine Liste der Produkte nach Kategorie ab.

Hosten der Web-API

Öffnen Sie die Datei Program.cs, und fügen Sie die folgenden using-Anweisungen hinzu:

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

Fügen Sie der Program-Klasse den folgenden Code hinzu.

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();
}

(Optional) Hinzufügen einer HTTP-URL-Namespacereservierung

Diese Anwendung lauscht auf http://localhost:8080/. Standardmäßig erfordert das Lauschen auf eine bestimmte HTTP-Adresse Administratorrechte. Wenn Sie das Tutorial ausführen, erhalten Sie daher möglicherweise den folgenden Fehler: "HTTP konnte url nicht registrieren http://+:8080/" Es gibt zwei Möglichkeiten, diesen Fehler zu vermeiden:

  • Ausführen von Visual Studio mit erhöhten Administratorberechtigungen oder
  • Verwenden Sie Netsh.exe, um Ihrem Konto Berechtigungen zum Reservieren der URL zu erteilen.

Um Netsh.exe zu verwenden, öffnen Sie eine Eingabeaufforderung mit Administratorrechten, und geben Sie den folgenden Befehl ein:

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

Dabei ist machine\username Ihr Benutzerkonto.

Wenn Sie mit der Selbsthostung fertig sind, müssen Sie die Reservierung löschen:

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

Aufrufen der Web-API aus einer Clientanwendung (C#)

Wir schreiben eine einfache Konsolenanwendung, die die Web-API aufruft.

Fügen Sie der Projektmappe ein neues Konsolenanwendungsprojekt hinzu:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und wählen Sie Neues Projekt hinzufügen aus.
  • Erstellen Sie eine neue Konsolenanwendung mit dem Namen "ClientApp".

Screenshot der Projektmappen-Explorer mit den Kontextmenüelementen Hinzufügen und Neues Projekt, die weiß hervorgehoben sind.

Verwenden Sie den NuGet-Paket-Manager, um das paket ASP.NET-Web-API Core Libraries hinzuzufügen:

  • Wählen Sie im Menü Extras die Option NuGet-Paket-Manager aus.
  • Wählen Sie NuGet-Pakete für Projektmappe verwalten aus.
  • Wählen Sie im Dialogfeld NuGet-Pakete verwalten die Option Online aus.
  • Geben Sie im Suchfeld "Microsoft.AspNet.WebApi.Client" ein.
  • Wählen Sie das Paket Microsoft ASP.NET-Web-API-Clientbibliotheken aus, und klicken Sie auf Installieren.

Fügen Sie einen Verweis in ClientApp zum SelfHost-Projekt hinzu:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ClientApp.
  • Klicken Sie auf Verweis hinzufügen.
  • Wählen Sie im Dialogfeld Verweis-Manager unter Projektmappedie Option Projekte aus.
  • Wählen Sie das Projekt SelfHost aus.
  • Klicken Sie auf OK.

Screenshot des Dialogfelds

Öffnen Sie die Datei Client/Program.cs. Fügen Sie die folgende using-Anweisung hinzu:

using System.Net.Http;

Fügen Sie einen statischen HttpClient-instance hinzu:

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

Fügen Sie die folgenden Methoden hinzu, um alle Produkte auflisten, ein Produkt nach ID auflisten und Produkte nach Kategorie auflisten.

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);
    }
}

Jede dieser Methoden folgt demselben Muster:

  1. Rufen Sie HttpClient.GetAsync auf, um eine GET-Anforderung an den entsprechenden URI zu senden.
  2. Rufen Sie httpResponseMessage.EnsureSuccessStatusCode auf. Diese Methode löst eine Ausnahme aus, wenn die HTTP-Antwort status ein Fehlercode ist.
  3. Rufen Sie ReadAsAsync<T> auf, um einen CLR-Typ aus der HTTP-Antwort zu deserialisieren. Diese Methode ist eine Erweiterungsmethode, die in System.Net.Http.HttpContentExtensions definiert ist.

Die Methoden GetAsync und ReadAsAsync sind beide asynchron. Sie geben Task-Objekte zurück, die den asynchronen Vorgang darstellen. Durch Das Abrufen der Result-Eigenschaft wird der Thread blockiert, bis der Vorgang abgeschlossen ist.

Weitere Informationen zur Verwendung von HttpClient, einschließlich nicht blockierenden Aufrufen, finden Sie unter Aufrufen einer Web-API von einem .NET-Client.

Legen Sie vor dem Aufrufen dieser Methoden die BaseAddress-Eigenschaft für die HttpClient-instance auf "http://localhost:8080" fest. Zum Beispiel:

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();
}

Dadurch sollte Folgendes ausgegeben werden. (Denken Sie daran, zuerst die SelfHost-Anwendung auszuführen.)

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 des Konsolenfensters mit einer ausgegebenen Liste von Produkten, die ID und Kategorien zugeordnet sind.