Samodzielne hostowanie ASP.NET Web API 1 (C#)

Autor: Mike Wasson

W tym samouczku pokazano, jak hostować internetowy interfejs API wewnątrz aplikacji konsolowej. ASP.NET Web API nie wymaga serwera IIS. Możesz samodzielnie uruchomić interfejs web API w swoim własnym procesie.

Nowe aplikacje powinny używać protokołu OWIN do samodzielnego hostowania internetowego interfejsu API. Zobacz Jak samodzielnie hostować ASP.NET Web API 2 za pomocą OWIN.

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 . Możesz też z menu plik wybrać pozycję Nowy, a następnie project.

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 Aplikacja formularzy systemu Windows 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 Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Właściwości. Na liście rozwijanej Platforma docelowa zmień platformę docelową na .NET Framework 4.0. Po wyświetleniu monitu o zastosowanie zmiany kliknij przycisk Tak.

Zrzut ekranu przedstawiający okno Eksploratora rozwiązań z listą rozwijaną platforma docelowa, w której podświetlony na niebiesko jest element .NET Framework 4.

Instalowanie Menedżera pakietów NuGet

Menedżer pakietów NuGet to najprostszy sposób dodawania zestawów Web API do projektu, który nie jest oparty na 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 "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, które pokazuje Menedżera pakietów NuGet w wynikach wyszukiwania, zaznaczonego na szaro.

Dodaj pakiet NuGet Web API

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

  1. W 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ł poprawnie zainstalowany.
  2. Wybierz 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-hostingowy ASP.NET Web API i kliknij przycisk Zainstaluj.
  6. Po zainstalowaniu pakietu kliknij przycisk Zamknij , aby zamknąć okno dialogowe.

Uwaga / Notatka

Pamiętaj, aby zainstalować pakiet o nazwie Microsoft.AspNet.WebApi.SelfHost, a nie AspNetWebApi.SelfHost.

Zrzut ekranu przedstawiający okno dialogowe "Zarządzanie pakietami NuGet", pokazujące pozycję "Microsoft A S P dot Net Web A P I Self Host", która jest podświetlona na niebiesko.

Tworzenie modelu i kontrolera

W tym samouczku użyto tych samych klas modelu i kontrolerów, 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ę na podstawie 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 za pomocą identyfikatora.
/api/products/?category=kategoria 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) Dodaj rezerwację 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 hostingu pamiętaj, aby usunąć rezerwację:

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

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

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

Dodaj nowy projekt aplikacji konsolowej do rozwiązania:

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

Zrzut ekranu Eksploratora rozwiązań przedstawiający elementy menu z prawym przyciskiem myszy Dodaj i Nowy projekt, który jest wyróżniony na biało.

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

  • W menu Narzędzia wybierz pozycję Menedżer pakietów NuGet.
  • Wybierz 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 bibliotek klienckich interfejsu API sieci Web ASP.NET Microsoft, a następnie kliknij przycisk Zainstaluj.

Dodaj odwołanie w aplikacji ClientApp do projektu SelfHost:

  • W Eksploratorze 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 okna dialogowego Menedżera odwołań, który pokazuje projekt Self Host wyróżniony niebieskim polem.

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

using System.Net.Http;

Dodaj statyczne wystąpienie 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 wykonać deserializowanie typu CLR z odpowiedzi HTTP. Ta metoda jest metodą rozszerzenia zdefiniowaną w elemencie System.Net.Http.HttpContentExtensions.

Metody GetAsync i ReadAsAsync są asynchroniczne. Zwracają obiekty zadania 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". 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();
}

Powinno to wyświetlić 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 okna konsoli z wyświetloną listą produktów skojarzonych z ID i kategoriami.