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.
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.
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:
- Uruchom program Visual Studio.
- W menu Narzędzia wybierz pozycję Rozszerzenia i Aktualizacje.
- W oknie dialogowym Rozszerzenia i Aktualizacje wybierz pozycję Online.
- Jeśli nie widzisz pozycji "Menedżer pakietów NuGet", wpisz "menedżer pakietów nuget" w polu wyszukiwania.
- Wybierz Menedżera pakietów NuGet i kliknij przycisk Pobierz.
- Po zakończeniu pobierania zostanie wyświetlony monit o zainstalowanie.
- Po zakończeniu instalacji może zostać wyświetlony monit o ponowne uruchomienie programu Visual Studio.
Dodawanie pakietu NuGet internetowego interfejsu API
Po zainstalowaniu Menedżera pakietów NuGet dodaj pakiet Self-Host internetowego interfejsu API do projektu.
- 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.
- Wybieranie pozycji Zarządzaj pakietami NuGet dla rozwiązania
- W oknie dialogowym Zarządzanie pakietami NugGet wybierz pozycję Online.
- W polu wyszukiwania wpisz "Microsoft.AspNet.WebApi.SelfHost".
- Wybierz pakiet self-host interfejsu API sieci Web ASP.NET i kliknij przycisk Zainstaluj.
- 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.
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".
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.
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:
- Wywołaj metodę HttpClient.GetAsync , aby wysłać żądanie GET do odpowiedniego identyfikatora URI.
- Wywołaj metodę HttpResponseMessage.EnsureSuccessStatusCode. Ta metoda zgłasza wyjątek, jeśli stan odpowiedzi HTTP to kod błędu.
- 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.