Bagikan melalui


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

oleh Mike Wasson

Tutorial ini menunjukkan cara menghosting API web di dalam aplikasi konsol. ASP.NET Web API tidak memerlukan IIS. Anda dapat menghost sendiri API web dalam proses host Anda sendiri.

Aplikasi baru harus menggunakan OWIN untuk menghost sendiri Web API. Lihat Menggunakan OWIN untuk Self-Host ASP.NET Web API 2.

Versi perangkat lunak yang digunakan dalam tutorial

  • WEB API 1
  • Visual Studio 2012

Membuat Proyek Aplikasi Konsol

Mulai Visual Studio dan pilih Proyek Baru dari halaman Mulai . Atau, dari menu File , pilih Baru lalu Proyek.

Di panel Templat , pilih Templat terinstal dan perluas simpul Visual C# . Di bawah Visual C#, pilih Windows. Dalam daftar templat proyek, pilih Aplikasi Konsol. Beri nama proyek "SelfHost" dan klik OK.

Cuplikan layar kotak dialog Proyek Baru memperlihatkan item Visual C# di daftar folder dan item Aplikasi Formulir Windows, yang disorot dalam warna abu-abu.

Mengatur Kerangka Kerja Target (Visual Studio 2010)

Jika Anda menggunakan Visual Studio 2010, ubah kerangka kerja target menjadi .NET Framework 4.0. (Secara default, templat proyek menargetkan Profil Klien .Net Framework.)

Di Penjelajah Solusi, klik kanan proyek dan pilih Properti. Di daftar dropdown Kerangka kerja target, ubah kerangka kerja target menjadi .NET Framework 4.0. Saat diminta untuk menerapkan perubahan, klik Ya.

Cuplikan layar jendela Penjelajah Solusi memperlihatkan daftar dropdown Kerangka Kerja Target dengan item dot NET Framework 4, yang disorot dengan warna biru.

Menginstal Pengelola Paket NuGet

NuGet Package Manager adalah cara term mudah untuk menambahkan rakitan Api Web ke proyek non-ASP.NET.

Untuk memeriksa apakah Pengelola Paket NuGet diinstal, klik menu Alat di Visual Studio. Jika Anda melihat item menu yang disebut NuGet Package Manager, maka Anda memiliki NuGet Package Manager.

Untuk menginstal NuGet Package Manager:

  1. Mulai Visual Studio.
  2. Dari menu Alat, pilih Ekstensi dan Updates.
  3. Dalam dialog Ekstensi dan Updates, pilih Online.
  4. Jika Anda tidak melihat "Pengelola Paket NuGet", ketik "manajer paket nuget" di kotak pencarian.
  5. Pilih Manajer Paket NuGet dan klik Unduh.
  6. Setelah pengunduhan selesai, Anda akan diminta untuk menginstal.
  7. Setelah penginstalan selesai, Anda mungkin diminta untuk memulai ulang Visual Studio.

Cuplikan layar kotak dialog Ekstensi dan Updates memperlihatkan Manajer Paket NuGet dalam hasil pencarian, yang disorot dengan warna abu-abu.

Menambahkan Paket Web API NuGet

Setelah NuGet Package Manager diinstal, tambahkan paket Self-Host API Web ke proyek Anda.

  1. Dari menu Alat , pilih Pengelola Paket NuGet. Catatan: Jika Anda tidak melihat item menu ini, pastikan NuGet Package Manager diinstal dengan benar.
  2. Pilih Kelola Paket NuGet untuk Solusi
  3. Dalam dialog Kelola Paket NugGet , pilih Online.
  4. Dalam kotak pencarian, ketik "Microsoft.AspNet.WebApi.SelfHost".
  5. Pilih paket ASP.NET Web API Self Host dan klik Instal.
  6. Setelah paket diinstal, klik Tutup untuk menutup dialog.

Catatan

Pastikan untuk menginstal paket bernama Microsoft.AspNet.WebApi.SelfHost, bukan AspNetWebApi.SelfHost.

Cuplikan layar kotak dialog Kelola Paket NuGet memperlihatkan Microsoft A S P dot Net Web A P I Self Host, yang disorot dengan warna biru.

Membuat Model dan Pengontrol

Tutorial ini menggunakan model dan kelas pengontrol yang sama dengan tutorial Memulai .

Tambahkan kelas publik bernama 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; }
    }
}

Tambahkan kelas publik bernama ProductsController. Dapatkan kelas ini dari 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));
        }
    }
}

Untuk informasi selengkapnya tentang kode di pengontrol ini, lihat tutorial Memulai . Pengontrol ini mendefinisikan tiga tindakan GET:

URI Deskripsi
/api/products Dapatkan daftar semua produk.
/api/products/id Dapatkan produk berdasarkan ID.
/api/products/?category=category Dapatkan daftar produk berdasarkan kategori.

Menghosting API Web

Buka file Program.cs dan tambahkan pernyataan penggunaan berikut:

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

Tambahkan kode berikut ke kelas 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();
}

(Opsional) Menambahkan Reservasi Namespace URL HTTP

Aplikasi ini mendengarkan http://localhost:8080/. Secara default, mendengarkan di alamat HTTP tertentu memerlukan hak istimewa administrator. Ketika Anda menjalankan tutorial, oleh karena itu, Anda mungkin mendapatkan kesalahan ini: "HTTP tidak dapat mendaftarkan URL http://+:8080/" Ada dua cara untuk menghindari kesalahan ini:

  • Jalankan Visual Studio dengan izin administrator yang ditinggikan, atau
  • Gunakan Netsh.exe untuk memberikan izin akun Anda untuk memesan URL.

Untuk menggunakan Netsh.exe, buka prompt perintah dengan hak istimewa administrator dan masukkan perintah berikut:perintah berikut:

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

di mana machine\username adalah akun pengguna Anda.

Ketika Anda selesai menghost sendiri, pastikan untuk menghapus reservasi:

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

Memanggil API Web dari Aplikasi Klien (C#)

Mari kita tulis aplikasi konsol sederhana yang memanggil API web.

Tambahkan proyek aplikasi konsol baru ke solusi:

  • Di Penjelajah Solusi, klik kanan solusi dan pilih Tambahkan Proyek Baru.
  • Buat aplikasi konsol baru bernama "ClientApp".

Cuplikan layar Penjelajah Solusi memperlihatkan item menu klik kanan Tambahkan dan Proyek Baru, yang disorot dengan warna putih.

Gunakan NuGet Package Manager untuk menambahkan paket ASP.NET Web API Core Libraries:

  • Dari menu Alat, pilih Pengelola Paket NuGet.
  • Pilih Kelola Paket NuGet untuk Solusi
  • Dalam dialog Kelola Paket NuGet , pilih Online.
  • Dalam kotak pencarian, ketik "Microsoft.AspNet.WebApi.Client".
  • Pilih paket Microsoft ASP.NET Web API Client Libraries dan klik Instal.

Tambahkan referensi di ClientApp ke proyek SelfHost:

  • Di Penjelajah Solusi, klik kanan proyek ClientApp.
  • Pilih Tambahkan Referensi.
  • Dalam dialog Manajer Referensi , di bawah Solusi, pilih Proyek.
  • Pilih proyek SelfHost.
  • Klik OK.

Cuplikan layar kotak dialog Manajer Referensi memperlihatkan proyek Host Mandiri, yang disorot dengan kotak biru.

Buka file Client/Program.cs. Tambahkan pernyataan penggunaan berikut:

using System.Net.Http;

Tambahkan instans HttpClient statis:

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

Tambahkan metode berikut untuk mencantumkan semua produk, mencantumkan produk menurut ID, dan mencantumkan produk menurut kategori.

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

Masing-masing metode ini mengikuti pola yang sama:

  1. Hubungi HttpClient.GetAsync untuk mengirim permintaan GET ke URI yang sesuai.
  2. Hubungi HttpResponseMessage.EnsureSuccessStatusCode. Metode ini memberikan pengecualian jika status respons HTTP adalah kode kesalahan.
  3. Panggil ReadAsAsync<T> untuk mendeserialisasi jenis CLR dari respons HTTP. Metode ini adalah metode ekstensi, yang ditentukan dalam System.Net.Http.HttpContentExtensions.

Metode GetAsync dan ReadAsync keduanya asinkron. Mereka mengembalikan objek Tugas yang mewakili operasi asinkron. Mendapatkan properti Hasil memblokir utas hingga operasi selesai.

Untuk informasi selengkapnya tentang menggunakan HttpClient, termasuk cara melakukan panggilan non-pemblokiran, lihat Memanggil API Web Dari Klien .NET.

Sebelum memanggil metode ini, atur properti BaseAddress pada instans HttpClient ke "http://localhost:8080". Contohnya:

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

Ini harus menghasilkan yang berikut ini. (Ingatlah untuk menjalankan aplikasi SelfHost terlebih dahulu.)

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.

Cuplikan layar jendela konsol memperlihatkan daftar produk output yang terkait dengan ID dan kategori.