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

tarafından Mike Wasson

Bu öğreticide, konsol uygulamasında web API'sini barındırma gösterilmektedir. ASP.NET Web API'sinde IIS gerekmez. Bir web API'sini kendi konak işleminizde barındırabilirsiniz.

Yeni uygulamalar, Web API'sini kendi kendine barındırmak için OWIN kullanmalıdır. Ayrıntılı bilgi için OWIN Kullanarak ASP.NET Web API 2'yi Kendi Başınıza Host Edin.

Öğreticide kullanılan yazılım sürümleri

  • Web API 1
  • Visual Studio 2012

Konsol Uygulaması Projesi Oluşturma

Visual Studio'yu başlatın ve Başlangıçsayfasından Yeni Proje'yi seçin. Alternatif olarak, Dosyamenüsünden Yeni'yi ve ardından Project'i seçin.

Şablonlar bölmesinde Yüklü Şablonlar'ı seçin ve Visual C# düğümünü genişletin. Visual C# altında Windows'ı seçin. Proje şablonları listesinde Konsol Uygulaması'nı seçin. Projeyi "SelfHost" olarak adlandırın ve Tamam'a tıklayın.

Klasör listesindeki Visual C# öğesini ve gri renkle vurgulanmış Windows Forms Uygulaması öğesini gösteren Yeni Proje iletişim kutusunun ekran görüntüsü.

Hedef Çerçeveyi Ayarlama (Visual Studio 2010)

Visual Studio 2010 kullanıyorsanız hedef çerçeveyi .NET Framework 4.0 olarak değiştirin. (Varsayılan olarak, proje şablonu .Net Framework İstemci Profili'ni hedefler.)

Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler'i seçin. Hedef çerçeve açılan listesinde hedef çerçeveyi .NET Framework 4.0 olarak değiştirin. Değişikliği uygulamanız istendiğinde Evet'e tıklayın.

Çözüm Gezgini penceresinin ekran görüntüsü, NET Framework 4 öğesinin mavi renkle vurgulandığı Hedef Çerçeve açılan listesini göstermektedir.

NuGet Paket Yöneticisi'ni yükleme

NuGet Paket Yöneticisi, Web API derlemelerini bir non-ASP.NET projesine eklemenin en kolay yoludur.

NuGet Paket Yöneticisi'nin yüklü olup olmadığını denetlemek için Visual Studio'da Araçlar menüsüne tıklayın. NuGet Paket Yöneticisi adlı bir menü öğesi görürseniz NuGet Paket Yöneticisi'ne sahip olursunuz.

NuGet Paket Yöneticisi'ni yüklemek için:

  1. Visual Studio'yu başlatın.
  2. Araçlar menüsünde Uzantılar ve Güncelleştirmeler'i seçin.
  3. Uzantılar ve Güncelleştirmeler iletişim kutusunda Çevrimiçi seçin.
  4. "NuGet Paket Yöneticisi" ifadesini görmüyorsanız, arama kutusuna "nuget paket yöneticisi" yazın.
  5. NuGet Paket Yöneticisi'ni seçin ve İndir'e tıklayın.
  6. İndirme tamamlandıktan sonra yüklemeniz istenir.
  7. Yükleme tamamlandıktan sonra Visual Studio'yu yeniden başlatmanız istenebilir.

Arama sonuçlarında Gri renkle vurgulanan NuGet Paket Yöneticisi'ni gösteren Uzantılar ve Güncelleştirmeler iletişim kutusunun ekran görüntüsü.

Web API NuGet Paketini Ekle

NuGet Paket Yöneticisi yüklendikten sonra Web API Self-Host paketini projenize ekleyin.

  1. Araçlar menüsünde NuGet Paket Yöneticisi'ni seçin. Not: Bu menü öğesini görmüyorsanız NuGet Paket Yöneticisi'nin doğru yüklendiğinden emin olun.
  2. Çözüm için NuGet Paketlerini Yönet'i seçin
  3. NugGet Paketlerini Yönet iletişim kutusunda Çevrimiçi'yi seçin.
  4. Arama kutusuna "Microsoft.AspNet.WebApi.SelfHost" yazın.
  5. ASP.NET Web API'sinin Kendi Kendine Konak paketini seçin ve Yükle'ye tıklayın.
  6. Paket yüklendikten sonra, iletişim kutusunu kapatmak için Kapat'a tıklayın.

Uyarı

AspNetWebApi.SelfHost değil Microsoft.AspNet.WebApi.SelfHost adlı paketi yüklediğinizden emin olun.

Microsoft ASP.NET Web API Self Host'un mavi renkle vurgulandığını gösteren NuGet Paketlerini Yönet iletişim kutusunun ekran görüntüsü.

Model ve Denetleyici oluşturma

Bu öğretici, Başlarken öğreticisi ile aynı model ve denetleyici sınıflarını kullanır.

adlı Productbir genel sınıf ekleyin.

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

adlı ProductsControllerbir genel sınıf ekleyin. Bu sınıfı System.Web.Http.ApiController'dan türetin.

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

Bu denetleyicideki kod hakkında daha fazla bilgi için Başlarken öğreticisine bakın. Bu denetleyici üç GET eylemi tanımlar:

URI (Evrensel Kaynak Tanımlayıcısı) Açıklama
/api/products Tüm ürünlerin listesini alın.
/api/products/id ID'sine göre bir ürün al.
/api/products/?category=kategori Kategoriye göre ürünlerin listesini alın.

Web API'sini barındırma

Dosya Program.cs'i açın ve aşağıdaki using ifadelerini ekleyin:

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

Program sınıfına aşağıdaki kodu ekleyin.

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

(İsteğe bağlı) HTTP URL Ad Alanı Rezervasyonu Ekleme

Bu uygulama http://localhost:8080/ dinlemesi yapar. Varsayılan olarak, belirli bir HTTP adresinde dinlemek için yönetici ayrıcalıkları gerekir. Bu nedenle öğreticiyi çalıştırdığınızda şu hatayı alabilirsiniz: "HTTP URL'yi http://+:8080/"kaydedemedi; Bu hatayı önlemenin iki yolu vardır:

  • Visual Studio'yu yükseltilmiş yönetici izinleriyle çalıştırın veya
  • Hesabınıza URL'yi ayırma izinleri vermek için Netsh.exe kullanın.

Netsh.exekullanmak için yönetici ayrıcalıklarıyla bir komut istemi açın ve şu komutu girin:aşağıdaki komutu:

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

burada machine\username kullanıcı hesabınızdır.

Kendi kendine barındırmayı bitirdiğinizde rezervasyonu sildiğinizden emin olun:

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

İstemci Uygulamasından Web API'sini çağırma (C#)

Şimdi web API'sini çağıran basit bir konsol uygulaması yazalım.

Çözüme yeni bir konsol uygulaması projesi ekleyin:

  • Çözüm Gezgini'nde çözüme sağ tıklayın ve Yeni Proje Ekle'yi seçin.
  • "ClientApp" adlı yeni bir konsol uygulaması oluşturun.

Sağ tıklama menü öğelerinin beyaz renkle vurgulandığı Ekle ve Yeni Proje öğelerini gösteren Çözüm Gezgini'nin ekran görüntüsü.

ASP.NET Web API Çekirdek Kitaplıkları paketini eklemek için NuGet Paket Yöneticisi'ni kullanın:

  • Araçlar menüsünde NuGet Paket Yöneticisi'ni seçin.
  • Çözüm için NuGet Paketlerini Yönet'i seçin
  • NuGet Paketlerini Yönet iletişim kutusunda Çevrimiçi seçin.
  • Arama kutusuna "Microsoft.AspNet.WebApi.Client" yazın.
  • Microsoft ASP.NET Web API İstemci Kitaplıkları paketini seçin ve Yükle'ye tıklayın.

ClientApp içinde SelfHost projesine referans ekleyin.

  • Çözüm Gezgini'nde ClientApp projesine sağ tıklayın.
  • Başvuru Ekle'yi seçin.
  • Başvuru Yöneticisi iletişim kutusundaki Çözüm altında Projeler'i seçin.
  • SelfHost projesini seçin.
  • Tamam'a tıklayın.

Mavi bir kutuyla vurgulanan Kendi Kendine Konak projesini gösteren Başvuru Yöneticisi iletişim kutusunun ekran görüntüsü.

İstemci/Program.cs dosyasını açın. Aşağıdaki using deyimini ekleyin:

using System.Net.Http;

Statik bir HttpClient örneği ekleyin:

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

Tüm ürünleri listelemek, bir ürünü kimliğe göre listelemek ve ürünleri kategoriye göre listelemek için aşağıdaki yöntemleri ekleyin.

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

Bu yöntemlerin her biri aynı deseni izler:

  1. Uygun URI'ye get isteği göndermek için HttpClient.GetAsync'i çağırın.
  2. HttpResponseMessage.EnsureSuccessStatusCode'u çağır. HTTP yanıt durumu bir hata koduysa bu yöntem bir özel durum oluşturur.
  3. bir CLR türünü HTTP yanıtından seri durumdan çıkarmak için ReadAsAsync<T>'yi çağırın. Bu yöntem, System.Net.Http.HttpContentExtensions içinde tanımlanan bir uzantı yöntemidir.

GetAsync ve ReadAsAsync yöntemleri zaman uyumsuz. Zaman uyumsuz işlemi temsil eden Görev nesnelerini döndürür. İşlem tamamlanana kadar Result özelliğini almak iş parçacığını bloke eder.

Engelleyici olmayan çağrılar yapma da dahil olmak üzere HttpClient kullanma hakkında daha fazla bilgi için bkz. .NET İstemcisinden Web API'si Çağırma.

Bu yöntemleri çağırmadan önce HttpClient örneğindeki BaseAddress özelliğini "http://localhost:8080" olarak ayarlayın. Örneğin:

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

Bu, aşağıdaki çıkışı vermelidir. (Önce SelfHost uygulamasını çalıştırmayı unutmayın.)

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.

I D ve kategorilerle ilişkilendirilmiş ürünlerin çıkış listesini gösteren konsol penceresinin ekran görüntüsü.