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

Mike Wasson

V tomto kurzu se dozvíte, jak hostovat webové rozhraní API v konzolové aplikaci. ASP.NET webové rozhraní API nevyžaduje službu IIS. Webové rozhraní API můžete hostovat sami ve vlastním hostitelském procesu.

Nové aplikace by měly používat OWIN k vlastnímu hostování webového rozhraní API. Viz Použití OWIN k Self-Host ASP.NET webového rozhraní API 2.

Verze softwaru použité v kurzu

  • Webové rozhraní API 1
  • Visual Studio 2012

Vytvoření projektu konzolové aplikace

Spusťte Visual Studio a na úvodní stránce vyberte Nový projekt. Nebo v nabídce Soubor vyberte Nový a pak Projekt.

V podokně Šablony vyberte Nainstalované šablony a rozbalte uzel Visual C# . V části Visual C# vyberte Windows. V seznamu šablon projektů vyberte Konzolová aplikace. Pojmenujte projekt SelfHost a klikněte na OK.

Snímek obrazovky dialogového okna Nový projekt zobrazující položku Visual C# v seznamu složek a položku aplikace model Windows Forms, která je zvýrazněná šedě

Nastavení cílové architektury (Visual Studio 2010)

Pokud používáte Visual Studio 2010, změňte cílovou architekturu na .NET Framework 4.0. (Ve výchozím nastavení šablona projektu cílí na profil klienta rozhraní .NET Framework.)

V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Vlastnosti. V rozevíracím seznamu Cílová architektura změňte cílovou architekturu na .NET Framework 4.0. Po zobrazení výzvy k použití změny klikněte na Ano.

Snímek obrazovky okna Průzkumník řešení zobrazující rozevírací seznam Cílová architektura s položkou tečky NET Framework 4, která je modře zvýrazněná

Instalace Správce balíčků NuGet

Správce balíčků NuGet je nejjednodušší způsob, jak přidat sestavení webového rozhraní API do projektu non-ASP.NET.

Pokud chcete zkontrolovat, jestli je nainstalovaný Správce balíčků NuGet, klikněte v sadě Visual Studio na nabídku Nástroje . Pokud se zobrazí položka nabídky s názvem Správce balíčků NuGet, máte Správce balíčků NuGet.

Instalace Správce balíčků NuGet:

  1. Spusťte Visual Studio.
  2. V nabídce Nástroje vyberte Rozšíření a Aktualizace.
  3. V dialogovém okně Rozšíření a Aktualizace vyberte Online.
  4. Pokud správce balíčků NuGet nevidíte, zadejte do vyhledávacího pole "správce balíčků nuget".
  5. Vyberte Správce balíčků NuGet a klikněte na Stáhnout.
  6. Po dokončení stahování se zobrazí výzva k instalaci.
  7. Po dokončení instalace se může zobrazit výzva k restartování sady Visual Studio.

Snímek obrazovky s dialogovým oknem Rozšíření a Aktualizace se Správcem balíčků NuGet ve výsledcích hledání, které je zvýrazněné šedě

Přidání balíčku NuGet webového rozhraní API

Po instalaci Správce balíčků NuGet přidejte do projektu balíček webového rozhraní API Self-Host.

  1. V nabídce Nástroje vyberte Správce balíčků NuGet. Poznámka: Pokud tuto položku nabídky nevidíte, ujistěte se, že je správně nainstalovaný Správce balíčků NuGet.
  2. Vyberte Spravovat balíčky NuGet pro řešení.
  3. V dialogovém okně Spravovat balíčky NugGet vyberte Online.
  4. Do vyhledávacího pole zadejte Microsoft.AspNet.WebApi.SelfHost.
  5. Vyberte balíček samoobslužného hostování webového rozhraní API ASP.NET a klikněte na Nainstalovat.
  6. Po instalaci balíčku zavřete dialogové okno kliknutím na Zavřít.

Poznámka

Nezapomeňte nainstalovat balíček s názvem Microsoft.AspNet.WebApi.SelfHost, nikoli AspNetWebApi.SelfHost.

Snímek obrazovky dialogového okna Spravovat balíčky NuGet zobrazující microsoft A S P dot Net Web A P I Self Host, který je modře zvýrazněný

Vytvoření modelu a kontroleru

Tento kurz používá stejné třídy modelu a kontroleru jako Začínáme kurz.

Přidejte veřejnou třídu s názvem 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; }
    }
}

Přidejte veřejnou třídu s názvem ProductsController. Odvodit tuto třídu z 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));
        }
    }
}

Další informace o kódu v tomto kontroleru najdete v kurzu k Začínáme. Tento kontroler definuje tři akce GET:

Identifikátor URI Description
/api/products Získejte seznam všech produktů.
/api/products/id Získání produktu podle ID
/api/products/?category=category Získejte seznam produktů podle kategorie.

Hostování webového rozhraní API

Otevřete soubor Program.cs a přidejte následující příkazy using:

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

Do třídy Program přidejte následující kód.

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

(Volitelné) Přidání rezervace oboru názvů ADRES URL protokolu HTTP

Tato aplikace naslouchá .http://localhost:8080/ Ve výchozím nastavení vyžaduje naslouchání na konkrétní adrese HTTP oprávnění správce. Při spuštění kurzu se proto může zobrazit tato chyba: "HTTP nemohl zaregistrovat adresu URL http://+:8080/" Této chybě se můžete vyhnout dvěma způsoby:

  • Spusťte Visual Studio se zvýšenými oprávněními správce nebo
  • Pomocí Netsh.exe udělte svému účtu oprávnění k rezervaci adresy URL.

Pokud chcete použít Netsh.exe, otevřete příkazový řádek s oprávněními správce a zadejte následující příkaz:

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

kde machine\username je váš uživatelský účet.

Po dokončení samoobslužného hostování nezapomeňte rezervaci odstranit:

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

Volání webového rozhraní API z klientské aplikace (C#)

Pojďme napsat jednoduchou konzolovou aplikaci, která volá webové rozhraní API.

Přidejte do řešení nový projekt konzolové aplikace:

  • V Průzkumník řešení klikněte pravým tlačítkem na řešení a vyberte Přidat nový projekt.
  • Vytvořte novou konzolovou aplikaci s názvem ClientApp.

Snímek obrazovky s Průzkumník řešení zobrazující položky nabídky Zobrazené po kliknutí pravým tlačítkem myši– Přidat a Nový projekt, které jsou zvýrazněné bíle

Pomocí Správce balíčků NuGet přidejte balíček ASP.NET základní knihovny webového rozhraní API:

  • V nabídce Nástroje vyberte Správce balíčků NuGet.
  • Vyberte Spravovat balíčky NuGet pro řešení.
  • V dialogovém okně Spravovat balíčky NuGet vyberte Online.
  • Do vyhledávacího pole zadejte Microsoft.AspNet.WebApi.Client.
  • Vyberte balíček Microsoft ASP.NET Web API Client Libraries a klikněte na Nainstalovat.

V ClientApp přidejte odkaz na projekt SelfHost:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt ClientApp.
  • Vyberte Přidat odkaz.
  • V dialogovém okně Správce odkazů v části Řešení vyberte Projekty.
  • Vyberte projekt SelfHost.
  • Klikněte na OK.

Snímek obrazovky s dialogovým oknem Správce odkazů zobrazující projekt samoobslužného hostování, který je zvýrazněný modrým polem

Otevřete soubor Client/Program.cs. Přidejte následující příkaz using :

using System.Net.Http;

Přidejte statickou instanci HttpClient :

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

Přidejte následující metody pro výpis všech produktů, výpis produktů podle ID a výpis produktů podle kategorie.

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

Každá z těchto metod se řídí stejným vzorem:

  1. Voláním httpClient.GetAsync odešlete požadavek GET na příslušný identifikátor URI.
  2. Zavolejte HttpResponseMessage.EnsureSuccessStatusCode. Tato metoda vyvolá výjimku, pokud je stav odpovědi HTTP kód chyby.
  3. Volání ReadAsAsync<T> k deserializaci typu CLR z odpovědi HTTP. Tato metoda je metoda rozšíření definovaná v System.Net.Http.HttpContentExtensions.

Metody GetAsync a ReadAsAsync jsou asynchronní. Vrátí objekty Task , které představují asynchronní operaci. Získání vlastnosti Result blokuje vlákno až do dokončení operace.

Další informace o používání HttpClient, včetně toho, jak provádět neblokující volání, najdete v tématu Volání webového rozhraní API z klienta .NET.

Před voláním těchto metod nastavte vlastnost BaseAddress v instanci HttpClient na "http://localhost:8080". Příklad:

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

Výstup by měl být následující. (Nezapomeňte nejprve spustit aplikaci 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.

Snímek obrazovky okna konzoly s výstupním seznamem produktů přidružených k ID a kategoriím