ASP.NET Web API 'SI kullanarak OData v4 uç noktası oluşturma

Açık Veri Protokolü (OData) Web için bir veri erişim protokolüdür. OData, CRUD işlemleri (oluşturma, okuma, güncelleştirme ve silme) aracılığıyla veri kümelerini sorgulamak ve işlemek için Tekdüzen bir yol sağlar.

ASP.NET Web API 'SI hem v3 hem de v4 protokolünü destekler. V3 uç noktasıyla yan yana çalışan bir v4 uç noktasına bile sahip olabilirsiniz.

Bu öğreticide, CRUD işlemlerini destekleyen bir OData v4 uç noktası oluşturma işlemi gösterilmektedir.

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

  • Web API 5,2
  • OData v4
  • Visual Studio 2017 (Visual Studio 2017 burayaindirin)
  • Entity Framework 6
  • .NET 4.7.2

Öğretici sürümleri

OData sürüm 3 için bkz. OData v3 uç noktası oluşturma.

Visual Studio projesi oluşturma

Visual Studio 'da, Dosya menüsünden Yeni > Proje' yi seçin.

Yüklü > C# Visual > Web' i genişletin ve ASP.NET Web uygulaması (.NET Framework) şablonunu seçin. Projeyi "ProductService"olarak adlandırın.

Tamam’ı seçin.

Boş şablonu seçin. İçin klasör ve çekirdek başvuruları Eklealtında Web API 'si' ni seçin. Tamam’ı seçin.

OData paketlerini yükler

Araçlar menüsünde NuGet Paket Yöneticisi > Paket Yöneticisi konsolu' nu seçin. Paket Yöneticisi konsol penceresinde, şunu yazın:

Install-Package Microsoft.AspNet.Odata

Bu komut en son OData NuGet paketlerini yükleme.

Bir model sınıfı ekleme

Model , uygulamanızdaki bir veri varlığını temsil eden bir nesnedir.

Çözüm Gezgini modeller klasörüne sağ tıklayın. Bağlam menüsünden > sınıfı Ekle ' yi seçin.

Note

Kurala göre, model sınıfları modeller klasörüne yerleştirilir, ancak bu kuralı kendi projelerinizde izlemeniz gerekmez.

Productsınıfı adlandırın. Product.cs dosyasında, demirbaş kodu aşağıdaki kodla değiştirin:

namespace ProductService.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Category { get; set; }
    }
}

Id özelliği varlık anahtarıdır. İstemciler, varlıkları anahtara göre sorgulayabilir. Örneğin, KIMLIĞI 5 olan ürünü almak için URI /Products(5). Id özelliği, arka uç veritabanında da birincil anahtar olacaktır.

Entity Framework etkinleştir

Bu öğreticide, arka uç veritabanını oluşturmak için Entity Framework (EF) Code First kullanacağız.

Note

Web API OData, EF gerektirmez. Veritabanı varlıklarını modellerle çevirebilirler herhangi bir veri erişim katmanını kullanın.

İlk olarak, EF için NuGet paketini yüklemeniz gerekir. Araçlar menüsünde NuGet Paket Yöneticisi > Paket Yöneticisi konsolu' nu seçin. Paket Yöneticisi konsol penceresinde, şunu yazın:

Install-Package EntityFramework

Web. config dosyasını açın ve aşağıdaki bölümü, configSections öğesinden sonra yapılandırma öğesinin içine ekleyin.

<configuration>
  <configSections>
    <!-- ... -->
  </configSections>

  <!-- Add this: -->
  <connectionStrings>
    <add name="ProductsContext" connectionString="Data Source=(localdb)\mssqllocaldb; 
        Initial Catalog=ProductsContext; Integrated Security=True; MultipleActiveResultSets=True; 
        AttachDbFilename=|DataDirectory|ProductsContext.mdf"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

Bu ayar, LocalDB veritabanı için bir bağlantı dizesi ekler. Bu veritabanı, uygulamayı yerel olarak çalıştırdığınızda kullanılacaktır.

Ardından modeller klasörüne ProductsContext adlı bir sınıf ekleyin:

using System.Data.Entity;
namespace ProductService.Models
{
    public class ProductsContext : DbContext
    {
        public ProductsContext() 
                : base("name=ProductsContext")
        {
        }
        public DbSet<Product> Products { get; set; }
    }
}

Oluşturucuda, "name=ProductsContext" bağlantı dizesinin adını verir.

OData uç noktasını yapılandırma

Start/WebApiConfig. cs_dosya uygulamasını açın. Aşağıdaki using deyimlerini ekleyin:

using ProductService.Models;
using Microsoft.AspNet.OData.Builder;
using Microsoft.AspNet.OData.Extensions;

Ardından register yöntemine aşağıdaki kodu ekleyin:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code:
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());
    }
}

Bu kod iki şeyi yapar:

  • Bir Varlık Veri Modeli (EDM) oluşturur.
  • Bir yol ekler.

EDM, verilerin soyut bir modelidir. EDM, hizmet meta verileri belgesi oluşturmak için kullanılır. ODataConventionModelBuilder sınıfı varsayılan adlandırma kurallarını kullanarak bir EDM oluşturur. Bu yaklaşım için en az kod gereklidir. EDM üzerinde daha fazla denetim istiyorsanız, özellik, anahtar ve gezinti özelliklerini açıkça ekleyerek EDM oluşturmak için ODataModelBuilder sınıfını kullanabilirsiniz.

Bir yol , Web API 'sine http isteklerini uç noktaya nasıl yönlendirildiğini söyler. OData v4 yolu oluşturmak için, MapODataServiceRoute genişletme yöntemini çağırın.

Uygulamanızda birden çok OData uç noktası varsa, her biri için ayrı bir yol oluşturun. Her rotaya benzersiz bir yol adı ve ön ek verin.

OData denetleyicisi ekleme

Denetleyici , http isteklerini işleyen bir sınıftır. OData hizmetinizde her bir varlık kümesi için ayrı bir denetleyici oluşturursunuz. Bu öğreticide, Product varlığı için bir denetleyici oluşturacaksınız.

Çözüm Gezgini, denetleyiciler klasörüne sağ tıklayın ve > sınıfı Ekle ' yi seçin. ProductsControllersınıfı adlandırın.

Note

OData v3 için Bu öğreticinin sürümü, denetleyiciyi Ekle yapı iskelesi kullanır. Şu anda OData v4 için bir yapı iskelesi yoktur.

ProductsController.cs içindeki ortak kodu aşağıdaki kodla değiştirin.

using ProductService.Models;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.OData;
namespace ProductService.Controllers
{
    public class ProductsController : ODataController
    {
        ProductsContext db = new ProductsContext();
        private bool ProductExists(int key)
        {
            return db.Products.Any(p => p.Id == key);
        } 
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

Denetleyici, EF kullanarak veritabanına erişmek için ProductsContext sınıfını kullanır. Denetleyicinin Productscontext'i atmak için Dispose metodunu geçersiz kıldığını unutmayın.

Bu, denetleyicinin başlangıç noktasıdır. Ardından, tüm CRUD işlemleri için yöntemler ekleyeceğiz.

Varlık kümesini sorgulama

ProductsControlleriçin aşağıdaki yöntemleri ekleyin.

[EnableQuery]
public IQueryable<Product> Get()
{
    return db.Products;
}
[EnableQuery]
public SingleResult<Product> Get([FromODataUri] int key)
{
    IQueryable<Product> result = db.Products.Where(p => p.Id == key);
    return SingleResult.Create(result);
}

Get yönteminin parametresiz sürümü tüm ürünler koleksiyonunu döndürür. Anahtar parametresine sahip Get yöntemi bir ürünü anahtarıyla arar (Bu durumda, Id özelliği).

[Enablequery] özniteliği, istemcilerin $filter, $sort ve $Page gibi sorgu seçeneklerini kullanarak sorguyu değiştirmesini sağlar. Daha fazla bilgi için bkz. OData sorgu seçeneklerini destekleme.

Varlık kümesine varlık ekleme

İstemcilerin veritabanına yeni bir ürün eklemesini sağlamak için aşağıdaki yöntemi ProductsControllerekleyin.

public async Task<IHttpActionResult> Post(Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Created(product);
}

Varlığı güncelleştirme

OData, bir varlığı güncelleştirmek için iki farklı semantiğini destekler, yama ve PUT.

  • Düzeltme Eki kısmi bir güncelleştirme gerçekleştirir. İstemci yalnızca güncelleştirilecek özellikleri belirtir.
  • PUT, tüm varlığın yerini alır.

PUT 'in dezavantajı, istemcinin, değişmeyen değerler de dahil olmak üzere varlıktaki tüm özelliklerin değerlerini gönderebilmesi gerekir. OData özelliği , düzeltme ekinin tercih edildiğini belirtir.

Her durumda, hem düzeltme eki hem de PUT yöntemlerinin kodu aşağıda verilmiştir:

public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    var entity = await db.Products.FindAsync(key);
    if (entity == null)
    {
        return NotFound();
    }
    product.Patch(entity);
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(entity);
}
public async Task<IHttpActionResult> Put([FromODataUri] int key, Product update)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    if (key != update.Id)
    {
        return BadRequest();
    }
    db.Entry(update).State = EntityState.Modified;
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(update);
}

Düzeltme durumunda, denetleyici değişiklikleri izlemek için Delta<t> türünü kullanır.

Bir varlığı silme

İstemcilerin bir ürünü veritabanından silmesini sağlamak için aşağıdaki yöntemi ProductsControllerekleyin.

public async Task<IHttpActionResult> Delete([FromODataUri] int key)
{
    var product = await db.Products.FindAsync(key);
    if (product == null)
    {
        return NotFound();
    }
    db.Products.Remove(product);
    await db.SaveChangesAsync();
    return StatusCode(HttpStatusCode.NoContent);
}