Udostępnij za pośrednictwem


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

Autor: Mike Wasson

W tym samouczku pokazano, jak hostować internetowy interfejs API w aplikacji konsolowej. ASP.NET internetowy interfejs API nie wymaga usług IIS. Możesz samodzielnie hostować internetowy interfejs API we własnym procesie hosta.

Nowe aplikacje powinny używać interfejsu OWIN do samodzielnego hostowania internetowego interfejsu API. Zobacz Use OWIN to Self-Host ASP.NET Web API 2 (Używanie interfejsu OWIN do Self-Host ASP.NET internetowego interfejsu API 2).

Wersje oprogramowania używane w samouczku

  • Internetowy interfejs API 1
  • Visual Studio 2012

Tworzenie projektu aplikacji konsolowej

Uruchom program Visual Studio i wybierz pozycję Nowy projekt na stronie Start . Ewentualnie w menu Plik wybierz pozycję Nowy , a następnie pozycję Projekt.

W okienku Szablony wybierz pozycję Zainstalowane szablony i rozwiń węzeł Visual C# . W obszarze Visual C# wybierz pozycję Windows. Na liście szablonów projektów wybierz pozycję Aplikacja konsolowa. Nadaj projektowi nazwę "SelfHost" i kliknij przycisk OK.

Zrzut ekranu przedstawiający okno dialogowe Nowy projekt z elementem Visual C# na liście folderów i elementem aplikacji Windows Forms wyróżnionym kolorem szarym.

Ustawianie platformy docelowej (Visual Studio 2010)

Jeśli używasz programu Visual Studio 2010, zmień strukturę docelową na .NET Framework 4.0. (Domyślnie szablon projektu jest przeznaczony dla profilu klienta programu .Net Framework).

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Właściwości. Na liście rozwijanej Platforma docelowa zmień strukturę docelową na .NET Framework 4.0. Po wyświetleniu monitu o zastosowanie zmiany kliknij przycisk Tak.

Zrzut ekranu przedstawiający okno Eksplorator rozwiązań z listą rozwijaną Platformy docelowej z wyróżnionym na niebiesko elementem dot NET Framework 4.

Instalowanie Menedżera pakietów NuGet

Menedżer pakietów NuGet to najprostszy sposób dodawania zestawów internetowego interfejsu API do projektu non-ASP.NET.

Aby sprawdzić, czy menedżer pakietów NuGet jest zainstalowany, kliknij menu Narzędzia w programie Visual Studio. Jeśli zostanie wyświetlony element menu o nazwie Menedżer pakietów NuGet, masz Menedżera pakietów NuGet.

Aby zainstalować Menedżera pakietów NuGet:

  1. Uruchom program Visual Studio.
  2. W menu Narzędzia wybierz pozycję Rozszerzenia i Aktualizacje.
  3. W oknie dialogowym Rozszerzenia i Aktualizacje wybierz pozycję Online.
  4. Jeśli nie widzisz pozycji "Menedżer pakietów NuGet", wpisz "menedżer pakietów nuget" w polu wyszukiwania.
  5. Wybierz Menedżera pakietów NuGet i kliknij przycisk Pobierz.
  6. Po zakończeniu pobierania zostanie wyświetlony monit o zainstalowanie.
  7. Po zakończeniu instalacji może zostać wyświetlony monit o ponowne uruchomienie programu Visual Studio.

Zrzut ekranu przedstawiający okno dialogowe Rozszerzenia i Aktualizacje z wyświetlonym Menedżerem pakietów NuGet w wynikach wyszukiwania wyróżnionym kolorem szarym.

Dodawanie pakietu NuGet internetowego interfejsu API

Po zainstalowaniu Menedżera pakietów NuGet dodaj pakiet Self-Host internetowego interfejsu API do projektu.

  1. Z menu Narzędzia wybierz pozycję Menedżer pakietów NuGet. Uwaga: jeśli ten element menu nie jest widoczny, upewnij się, że menedżer pakietów NuGet został zainstalowany poprawnie.
  2. Wybieranie pozycji Zarządzaj pakietami NuGet dla rozwiązania
  3. W oknie dialogowym Zarządzanie pakietami NugGet wybierz pozycję Online.
  4. W polu wyszukiwania wpisz "Microsoft.AspNet.WebApi.SelfHost".
  5. Wybierz pakiet self-host interfejsu API sieci Web ASP.NET i kliknij przycisk Zainstaluj.
  6. Po zainstalowaniu pakietu kliknij przycisk Zamknij , aby zamknąć okno dialogowe.

Uwaga

Upewnij się, że zainstalowano pakiet o nazwie Microsoft.AspNet.WebApi.SelfHost, a nie AspNetWebApi.SelfHost.

Zrzut ekranu przedstawiający okno dialogowe Zarządzanie pakietami NuGet z wyróżnioną niebieską pozycją Microsoft A S P dot Net Web A P I Self Host.

Tworzenie modelu i kontrolera

W tym samouczku są używane te same klasy modelu i kontrolera co samouczek Wprowadzenie.

Dodaj klasę publiczną o nazwie 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; }
    }
}

Dodaj klasę publiczną o nazwie ProductsController. Utwórz tę klasę z elementu 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));
        }
    }
}

Aby uzyskać więcej informacji na temat kodu w tym kontrolerze, zobacz samouczek Wprowadzenie. Ten kontroler definiuje trzy akcje GET:

URI Opis
/api/products Pobierz listę wszystkich produktów.
/api/products/id Pobierz produkt według identyfikatora.
/api/products/?category=category=category Pobierz listę produktów według kategorii.

Hostowanie internetowego interfejsu API

Otwórz plik Program.cs i dodaj następujące instrukcje using:

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

Dodaj następujący kod do klasy 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();
}

(Opcjonalnie) Dodawanie rezerwacji przestrzeni nazw adresu URL HTTP

Ta aplikacja nasłuchuje .http://localhost:8080/ Domyślnie nasłuchiwanie pod określonym adresem HTTP wymaga uprawnień administratora. W związku z tym po uruchomieniu samouczka może wystąpić następujący błąd: "Http nie może zarejestrować adresu URL http://+:8080/" Istnieją dwa sposoby uniknięcia tego błędu:

  • Uruchamianie programu Visual Studio z podwyższonym poziomem uprawnień administratora lub
  • Użyj Netsh.exe, aby przyznać swojemu kontu uprawnienia do zarezerwowania adresu URL.

Aby użyć Netsh.exe, otwórz wiersz polecenia z uprawnieniami administratora i wprowadź następujące polecenie:

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

gdzie machine\username to Twoje konto użytkownika.

Po zakończeniu samodzielnego hostowania pamiętaj, aby usunąć rezerwację:

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

Wywoływanie internetowego interfejsu API z poziomu aplikacji klienckiej (C#)

Napiszmy prostą aplikację konsolową, która wywołuje internetowy interfejs API.

Dodaj nowy projekt aplikacji konsolowej do rozwiązania:

  • W Eksplorator rozwiązań kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Dodaj nowy projekt.
  • Utwórz nową aplikację konsolową o nazwie "ClientApp".

Zrzut ekranu przedstawiający Eksplorator rozwiązań pokazujący elementy menu z prawym przyciskiem myszy Dodaj i Nowy projekt, które zostały wyróżnione na biało.

Użyj Menedżera pakietów NuGet, aby dodać pakiet bibliotek podstawowych interfejsu API sieci Web ASP.NET:

  • Z menu Narzędzia wybierz pozycję Menedżer pakietów NuGet.
  • Wybieranie pozycji Zarządzaj pakietami NuGet dla rozwiązania
  • W oknie dialogowym Zarządzanie pakietami NuGet wybierz pozycję Online.
  • W polu wyszukiwania wpisz "Microsoft.AspNet.WebApi.Client".
  • Wybierz pakiet Biblioteki klienta interfejsu API sieci Web ASP.NET Microsoft, a następnie kliknij przycisk Zainstaluj.

Dodaj odwołanie w aplikacji ClientApp do projektu SelfHost:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt ClientApp.
  • Wybierz pozycję Dodaj odwołanie.
  • W oknie dialogowym Menedżer odwołań w obszarze Rozwiązanie wybierz pozycję Projekty.
  • Wybierz projekt SelfHost.
  • Kliknij przycisk OK.

Zrzut ekranu przedstawiający okno dialogowe Menedżera odwołań z wyróżnionym projektem self-host, który został wyróżniony niebieskim polem.

Otwórz plik Client/Program.cs. Dodaj następującą instrukcję using :

using System.Net.Http;

Dodaj statyczne wystąpienie klienta HttpClient :

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

Dodaj następujące metody, aby wyświetlić listę wszystkich produktów, wyświetlić listę produktów według identyfikatora i wyświetlić listę produktów według kategorii.

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żda z tych metod jest zgodna z tym samym wzorcem:

  1. Wywołaj metodę HttpClient.GetAsync , aby wysłać żądanie GET do odpowiedniego identyfikatora URI.
  2. Wywołaj metodę HttpResponseMessage.EnsureSuccessStatusCode. Ta metoda zgłasza wyjątek, jeśli stan odpowiedzi HTTP to kod błędu.
  3. Wywołaj metodę ReadAsAsync<T> , aby deserializować typ CLR z odpowiedzi HTTP. Ta metoda jest metodą rozszerzenia zdefiniowaną w elemencie System.Net.Http.HttpContentExtensions.

Metody GetAsync i ReadAsAsync są asynchroniczne. Zwracają obiekty task reprezentujące operację asynchroniczną. Pobieranie właściwości Result blokuje wątek do momentu zakończenia operacji.

Aby uzyskać więcej informacji na temat używania klienta HttpClient, w tym sposobu wykonywania wywołań nieblokujących, zobacz Wywoływanie internetowego interfejsu API z klienta platformy .NET.

Przed wywołaniem tych metod ustaw właściwość BaseAddress w wystąpieniu HttpClient na wartość "http://localhost:8080". Na przykład:

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

Powinny zostać wyświetlone następujące dane wyjściowe. (Pamiętaj, aby najpierw uruchomić aplikację 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.

Zrzut ekranu przedstawiający okno konsoli z wyświetloną listą produktów skojarzonych z I D i kategoriami.