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

tarafından Mike Wasson

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

Yeni uygulamalar, Web API'sini kendi kendine barındırmak için OWIN kullanmalıdır. Bkz. Web API 2'yi Self-Host ASP.NET için OWIN kullanma.

Öğ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 Proje'yi 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 Uygulama öğ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'da 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ğin uygulanması istendiğinde Evet'e tıklayın.

Mavi renkle vurgulanmış nokta NET Framework 4 öğesini içeren Hedef Çerçeve açılan listesini gösteren Çözüm Gezgini penceresinin ekran görüntüsü.

NuGet Paket Yöneticisi'ni yükleme

NuGet Paket Yöneticisi, Web API derlemelerini non-ASP.NET bir projeye 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 sahipsiniz demektir.

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

  1. Visual Studio’yu çalıştırın.
  2. Araçlar menüsünde Uzantılar ve Güncelleştirmeler'yi seçin.
  3. Uzantılar ve Güncelleştirmeler iletişim kutusunda Çevrimiçi'ni 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'sini NuGet Paketi Ekleme

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'ni 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.

Not

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

Mavi renkle vurgulanan Microsoft A S P noktalı Net Web A P I Kendi Kendine Ana Bilgisayarı'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 Description
/api/products Tüm ürünlerin listesini alın.
/api/products/id Kimliğine göre bir ürün alın.
/api/products/?category=category Kategoriye göre ürünlerin listesini alın.

Web API'sini barındırma

Program.cs dosyasını açın ve aşağıdaki using deyimlerini 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ı Ayırması Ekleme

Bu uygulama dinler http://localhost:8080/. 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.exe kullanmak için yönetici ayrıcalıklarıyla bir komut istemi açın ve şu komutu girin:

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'da çözüme sağ tıklayın ve Yeni Proje Ekle'yi seçin.
  • "ClientApp" adlı yeni bir konsol uygulaması oluşturun.

Beyaz renkle vurgulanan Sağ tıklama menü öğelerini gösteren Çözüm Gezgini ekran görüntüsü Ekle ve Yeni Proje.

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'ni 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'te SelfHost projesine bir başvuru ekleyin:

  • Çözüm Gezgini'da ClientApp projesine sağ tıklayın.
  • Başvuru Ekle'yi seçin.
  • Başvuru Yöneticisi iletişim kutusundaki Çözüm'in 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ü.

Client/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 bir 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 kaldırmak 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ürler. Result özelliğini almak, işlem tamamlanana kadar iş parçacığını engeller.

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. Örnek:

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şkili ürünlerin çıkış listesini gösteren konsol penceresinin ekran görüntüsü.