Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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 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.
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:
- 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 "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.
Dodaj pakiet NuGet Web API
Po zainstalowaniu Menedżera pakietów NuGet dodaj do projektu pakiet Web API Self-Host.
- 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.
- Wybierz 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-hostingowy ASP.NET Web API i kliknij przycisk Zainstaluj.
- 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".
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.
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:
- 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 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.