Aracılığıyla paylaş


ASP.NET Core ve MongoDB ile web API'si oluşturma

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz. .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Tarafından Pratik Khandelwal ve Scott Addie

Bu öğretici, MongoDB NoSQL veritabanında Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) işlemlerini çalıştıran bir web API'sini oluşturur.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • MongoDB'yi yapılandırma
  • MongoDB veritabanı oluşturma
  • MongoDB koleksiyonu ve şeması tanımlama
  • Web API'sinden MongoDB CRUD işlemleri gerçekleştirme
  • JSON serileştirmeyi özelleştirme

Önkoşullar

MongoDB'yi yapılandırma

Geliştirme makinesinde (Windows/Linux/macOS) her yerden MongoDB ve MongoDB Kabuğu erişimini etkinleştirin:

  1. MongoDB Kabuğunu İndirme ve Yükleme:

    • macOS/Linux: MongoDB Kabuğunu ayıklamak için bir dizin seçin. ortam değişkenine mongosh için PATH sonuç yolunu ekleyin.
    • Windows: MongoDB Kabuğu (mongosh.exe), C:\Users\user<\>AppData\Local\Programs\mongosh konumunda yüklenir. ortam değişkenine mongosh.exe için PATH sonuç yolunu ekleyin.
  2. MongoDB'yi indirin ve yükleyin:

    • macOS/Linux: Genellikle /usr/local/mongodb içinde MongoDB'nin yüklendiği dizini doğrulayın. ortam değişkenine mongodb için PATH sonuç yolunu ekleyin.
    • Windows: MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\binPATH.
  3. Veri Depolama Dizini seçin: Verileri depolamak için geliştirme makinenizde bir dizin seçin. Yoksa dizini oluşturun. MongoDB Kabuğu yeni dizinler oluşturmaz:

    • macOS/Linux: Örneğin, /usr/local/var/mongodb.
    • Windows: Örneğin, C:\\BooksData.
  4. İşletim sistemi komut kabuğunda (MongoDB Kabuğu değil), varsayılan bağlantı noktası 27017'de MongoDB'ye bağlanmak için aşağıdaki komutu kullanın. <data_directory_path> değerini önceki adımda seçilen dizinle değiştirin.

    mongod --dbpath <data_directory_path>
    

Veritabanı oluşturmak, koleksiyonlar yapmak ve belgeleri depolamak için aşağıdaki adımlarda daha önce yüklenmiş mongoDB kabuğunu kullanın. MongoDB Kabuğu komutları hakkında daha fazla bilgi için bkz mongosh.

  1. komutunu başlatarak mongosh.exeveya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:

    mongosh
    
  2. Komut kabuğunda şu komutu çalıştırarak varsayılan test veritabanına bağlanın:

    use BookStore
    

    BookStore adlı bir veritabanı henüz yoksa oluşturulur. Veritabanı mevcutsa, işlemler için bağlantısı açılır.

  3. Aşağıdaki komutu kullanarak koleksiyon Books oluşturun:

    db.createCollection('Books')
    

    Aşağıdaki sonuç görüntülenir:

    { "ok" : 1 }
    
  4. Koleksiyon için Books bir şema tanımlayın ve aşağıdaki komutu kullanarak iki belge ekleyin:

    db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("61a6058e6c43f32854e51f51"),
            ObjectId("61a6058e6c43f32854e51f52")
         ]
     }
    

    Not

    ObjectIdÖnceki sonuçta gösterilenler, komut kabuğunda gösterilenlerle eşleşmez.

  5. Aşağıdaki komutu kullanarak veritabanındaki belgeleri görüntüleyin:

    db.Books.find().pretty()
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
         "_id" : ObjectId("61a6058e6c43f32854e51f51"),
         "Name" : "Design Patterns",
         "Price" : 54.93,
         "Category" : "Computers",
         "Author" : "Ralph Johnson"
     }
     {
         "_id" : ObjectId("61a6058e6c43f32854e51f52"),
         "Name" : "Clean Code",
         "Price" : 43.15,
         "Category" : "Computers",
         "Author" : "Robert C. Martin"
     }
    

    Şema, her belge için otomatik olarak oluşturulan türü _id bir ObjectId özelliği ekler.

ASP.NET Core web API projesini oluşturma

  1. Dosya gidin.
  2. ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.
  3. Projeye BookStoreApi adını verin ve İleri'yi seçin.
  4. Ek bilgi iletişim kutusunda:
  • Çerçevenin.NET 9.0 (Standart Terim Desteği) olduğunu onaylayın.
  • Denetleyicileri kullan onay kutusunun işaretli olduğunu onaylayın.
  • OpenAPI desteğini etkinleştir onay kutusunun işaretli olduğunu onaylayın.
  • Oluştur'u seçin.
  1. Paket Yöneticisi Konsolu penceresinde proje köküne gidin. MongoDB için .NET sürücüsünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-Package MongoDB.Driver
    

Varlık modeli ekleme

  1. Proje köküne models dizini ekleyin.

  2. Book dizinine aşağıdaki kodla bir sınıf ekleyin:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace BookStoreApi.Models;
    
    public class Book
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string? Id { get; set; }
    
        [BsonElement("Name")]
        public string BookName { get; set; } = null!;
    
        public decimal Price { get; set; }
    
        public string Category { get; set; } = null!;
    
        public string Author { get; set; } = null!;
    }
    

    Önceki sınıfta Id özelliği şöyledir:

    • Ortak Dil Çalışma Zamanı (CLR) nesnesini MongoDB koleksiyonuna eşlemek için gereklidir.
    • Bu özelliği belgenin birincil anahtarı yapmak için [BsonId] ile anotasyon yapıldı.
    • parametresinin ObjectId[BsonRepresentation(BsonType.ObjectId)]yapısı yerine tür string olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'den string öğesine dönüştürmeyi ObjectIdişler.

    BookName özelliğine özniteliğiyle [BsonElement] ek açıklama eklenir. özniteliğinin değeri Name MongoDB koleksiyonundaki özellik adını temsil eder.

Yapılandırma modeli ekleme

  1. aşağıdaki veritabanı yapılandırma değerlerini içine appsettings.jsonekleyin:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. BookStoreDatabaseSettings dizinine aşağıdaki kodla bir sınıf ekleyin:

    namespace BookStoreApi.Models;
    
    public class BookStoreDatabaseSettings
    {
        public string ConnectionString { get; set; } = null!;
    
        public string DatabaseName { get; set; } = null!;
    
        public string BooksCollectionName { get; set; } = null!;
    }
    

    Önceki BookStoreDatabaseSettings sınıf, dosyanın appsettings.json özellik değerlerini depolamak BookStoreDatabase için kullanılır. Eşleme işlemini kolaylaştırmak için JSON ve C# özellik adları aynı şekilde adlandırılır.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    

    Yukarıdaki kodda, dosyanın appsettings.json bölümünün bağlandığı BookStoreDatabase yapılandırma örneği Bağımlılık Ekleme (DI) kapsayıcısına kaydedilir. Örneğin, nesnesinin BookStoreDatabaseSettingsConnectionString özelliği içindeki BookStoreDatabase:ConnectionStringözelliğiyle appsettings.json doldurulur.

  4. Program.cs üst kısmına şu kodu ekleyerek BookStoreDatabaseSettings referansını çözün:

    using BookStoreApi.Models;
    

CRUD işlem hizmeti ekleme

  1. Proje köküne bir Services dizini ekleyin.

  2. Services dizinine aşağıdaki kodla bir BooksService sınıf ekleyin:

    using BookStoreApi.Models;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    
    namespace BookStoreApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                bookStoreDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                bookStoreDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                bookStoreDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    

    Önceki kodda, bir BookStoreDatabaseSettings örneği oluşturucu enjeksiyonu yoluyla DI'den alınır. Bu teknik, Yapılandırma appsettings.json bölümünde eklenen yapılandırma değerlerine erişim sağlar.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    

    Yukarıdaki kodda BooksService sınıfı, kullanan sınıflarda oluşturucu eklemeyi desteklemek için DI ile kaydedilir. Tekil hizmet ömrü en uygun olandır çünkü BooksService, MongoClient üzerinde doğrudan bağımlıdır. Resmi Mongo İstemcisi yeniden kullanım yönergeleri uyarınca, MongoClient tekil hizmet ömrüyle DI'ye kaydedilmelidir.

  4. Program.cs üst kısmına şu kodu ekleyerek BooksService referansını çözün:

    using BookStoreApi.Services;
    

sınıfı, BooksService veritabanında CRUD işlemlerini çalıştırmak için aşağıdaki MongoDB.Driver üyeleri kullanır:

  • MongoClient: Veritabanı işlemlerini çalıştırmak için sunucu örneğini okur. Bu sınıfın oluşturucusu, MongoDB bağlantı dizesi içinde bulunur.

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: çalıştırma işlemleri için Mongo veritabanını temsil eder. Bu öğreticide, belirli bir koleksiyondaki verilere erişim elde etmek için arabirimdeki genel GetCollection<TDocument>(koleksiyon) yöntemi kullanılır. Bu yöntem çağrıldıktan sonra koleksiyona karşı CRUD işlemlerini çalıştırın. GetCollection<TDocument>(collection) yöntem çağrısında:

    • collection koleksiyon adını temsil eder.
    • TDocument koleksiyonda depolanan CLR nesne türünü temsil eder.

GetCollection<TDocument>(collection) , koleksiyonu temsil eden bir MongoCollection nesnesi döndürür. Bu öğreticide, koleksiyondaki yöntemler aşağıdaki şekilde çağrılacak:

  • DeleteOneAsync: Sağlanan arama ölçütleriyle eşleşen tek bir belgeyi siler.
  • Bulmak<TDocument>: Koleksiyondaki sağlanan arama ölçütleriyle eşleşen tüm belgeleri döndürür.
  • InsertOneAsync: Sağlanan nesneyi koleksiyona yeni bir belge olarak ekler.
  • ReplaceOneAsync: Sağlanan arama ölçütleriyle eşleşen tek belgeyi sağlanan nesneyle değiştirir.

Denetleyici ekleme

BooksController dizinine aşağıdaki kodla bir sınıf ekleyin:

using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;

namespace BookStoreApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
    private readonly BooksService _booksService;

    public BooksController(BooksService booksService) =>
        _booksService = booksService;

    [HttpGet]
    public async Task<List<Book>> Get() =>
        await _booksService.GetAsync();

    [HttpGet("{id:length(24)}")]
    public async Task<ActionResult<Book>> Get(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        return book;
    }

    [HttpPost]
    public async Task<IActionResult> Post(Book newBook)
    {
        await _booksService.CreateAsync(newBook);

        return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
    }

    [HttpPut("{id:length(24)}")]
    public async Task<IActionResult> Update(string id, Book updatedBook)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

    [HttpDelete("{id:length(24)}")]
    public async Task<IActionResult> Delete(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

Önceki web API'si denetleyicisi:

  • CRUD işlemlerini çalıştırmak için sınıfını BooksService kullanır.
  • GET, POST, PUT ve DELETE HTTP isteklerini desteklemek için eylem yöntemleri içerir.
  • CreatedAtAction Create yanıtı döndürmek için eylem yönteminde çağrılar. Durum kodu 201, sunucuda yeni bir kaynak oluşturan bir HTTP POST yöntemi için standart yanıttır. CreatedAtAction ayrıca yanıta bir Location üst bilgi ekler. Başlık, Location yeni oluşturulan kitabın URI'sini belirtir.

JSON serileştirme seçeneklerini yapılandırma

Web API'sini test etme bölümünde döndürülen JSON yanıtları hakkında değiştirecek iki ayrıntı vardır:

  • Özellik adlarının varsayılan deve sırtı yazımı, CLR nesnesinin özellik adlarının Pascal durumuyla eşleşecek şekilde değiştirilmelidir.
  • bookName özelliği Name olarak döndürülmelidir.

Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:

  1. Program.cs içinde, aşağıdaki vurgulanmış kodu AddControllers yöntemi çağrısına zincirleyin.

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    
    builder.Services.AddControllers()
        .AddJsonOptions(
            options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
    

    Yukarıdaki değişiklikle, web API'sinin serileştirilmiş JSON yanıtlarındaki özellik adları CLR nesne türündeki ilgili özellik adlarıyla eşleşmektedir. Örneğin, Book sınıfının Author özelliği, Author yerine author olarak serileştirilir.

  2. Models/Book.cs içinde, BookName özelliğine [JsonPropertyName] özniteliği ekleyin.

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    [JsonPropertyName] özniteliğinin değeriName, web API'sinin serileştirilmiş JSON yanıtında özellik adını temsil eder.

  3. Models/Book.cs'nın üst kısmına aşağıdaki kodu ekleyin [JsonProperty] öznitelik başvurusunu çözmek için:

    using System.Text.Json.Serialization;
    
  4. Web API'sini test et bölümünde tanımlanan adımları yineleyin. JSON özellik adlarındaki farka dikkat edin.

Web API'sini test edin

Bu öğreticide API'yi test etmek için Uç Nokta Gezgini ve .http dosyaları kullanılır.

  1. Uygulamayı derleyin ve çalıştırın.

  2. Uç Nokta Gezgini'nde, ilk GET uç noktasına /api/bookssağ tıklayın ve İstek oluştur'a tıklayın.

    Dosyaya BookStoreApi.http aşağıdaki içerik eklenir. İlk kez istek oluşturulduysa, dosya proje kökünde oluşturulur.

    @BookStoreApi_HostAddress = https://localhost:<port>
    
    GET {{BookStoreApi_HostAddress}}/api/books
    
    ###
    

    Bağlantı noktası numarası, uygulama tarafından kullanılan bağlantı noktasına ayarlanmış olmalıdır; örneğin, https://localhost:56874. Böyle bir durum söz konusu değilse, uygulamayı başlattığınızda çıkış penceresinde bağlantı noktası numaranızı bulabilirsiniz.

  3. Yeni istek satırının üzerindeki GET bağlantısını seçin.

    GET isteği uygulamaya gönderilir ve yanıt Yanıt bölmesinde görüntülenir.

  4. Yanıt gövdesi, aşağıdakine benzer kitap girişlerini içeren JSON sonucunu gösterir:

    [
      {
        "Id": "61a6058e6c43f32854e51f51",
        "Name": "Design Patterns",
        "Price": 54.93,
        "Category": "Computers",
        "Author": "Ralph Johnson"
      },
      {
        "Id": "61a6058e6c43f32854e51f52",
        "Name": "Clean Code",
        "Price": 43.15,
        "Category": "Computers",
        "Author": "Robert C. Martin"
      }
    ]
    
  5. Tek bir kitap almak için /api/books/{id}, params (string id)GET uç noktasına sağ tıklayın ve İstek oluştur'a tıklayın.

    Dosyanın sonuna BookStoreApi.http aşağıdaki içerik eklenir:

    @id=string
    GET {{BookStoreApi_HostAddress}}/api/books/{{id}}
    
    ###
    
  6. id değişkenini, önceki istekten döndürülen kimliklerden biriyle değiştirin. Örneğin:

    @id="61a6058e6c43f32854e51f52"
    GET {{BookStoreApi_HostAddress}}/api/books/{{id}}
    
    ###
    
  7. Yeni istek satırının üzerindeki GET bağlantısını seçin.

    GET isteği uygulamaya gönderilir ve yanıt Yanıt bölmesinde görüntülenir.

  8. Yanıt gövdesi JSON'ı aşağıdakine benzer şekilde gösterir:

    {
      "Id": "61a6058e6c43f32854e51f52",
      "Name": "Clean Code",
      "Price": 43.15,
      "Category": "Computers",
      "Author": "Robert C. Martin"
    }
    
  9. POST uç noktasını test etmek için /api/books uç noktasına sağ tıklayın ve İstek oluştur'a tıklayın.

    Dosyaya BookStoreApi.http aşağıdaki içerik eklenir:

    POST {{BookStoreApi_HostAddress}}/api/books
    Content-Type: application/json
    
    {
      //Book
    }
    
    ###
    
  10. Kitap açıklamasını JSON istek gövdesi olarak bir kitap nesnesiyle değiştirin:

    POST {{BookStoreApi_HostAddress}}/api/books
    Content-Type: application/json
    
     {
       "Name": "The Pragmatic Programmer",
       "Price": 49.99,
       "Category": "Computers",
       "Author": "Andy Hunt"
     }
    
    ###
    
  11. İstek satırının üstündeki POST bağlantısını seçin.

    POST isteği uygulamaya gönderilir ve yanıt Yanıt bölmesinde görüntülenir. Yanıt, atanan kimliğiyle yeni oluşturulan kitabı içermelidir.

  12. Son olarak, bir kitabı silmek için /api/books/{id}, params (string id) uç noktasına sağ tıklayın ve İstek oluştur'a tıklayın.

    Dosyanın sonuna BookStoreApi.http aşağıdaki içerik eklenir:

    DELETE {{BookStoreApi_HostAddress}}/api/Books/{{id}}
    
    ###
    
  13. değişkenini id önceki istekten döndürülen kimliklerden biriyle değiştirin ve İstek gönder'e tıklayın. Örneğin:

    DELETE {{BookStoreApi_HostAddress}}/api/Books/67f417517ce1b36aeab71236
    
    ###
    

Web API'sine kimlik doğrulaması desteği ekleme

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Önemli

Duende Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.

Daha fazla bilgi için Duende Server belgelerine Identity bakın.

Ek kaynaklar

Bu öğretici, MongoDB NoSQL veritabanında Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) işlemlerini çalıştıran bir web API'sini oluşturur.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • MongoDB'yi yapılandırma
  • MongoDB veritabanı oluşturma
  • MongoDB koleksiyonu ve şeması tanımlama
  • Web API'sinden MongoDB CRUD işlemleri gerçekleştirme
  • JSON serileştirmeyi özelleştirme

Önkoşullar

MongoDB'yi yapılandırma

Geliştirme makinesinde (Windows/Linux/macOS) her yerden MongoDB ve MongoDB Kabuğu erişimini etkinleştirin:

  1. MongoDB Kabuğunu İndirme ve Yükleme:

    • macOS/Linux: MongoDB Kabuğunu ayıklamak için bir dizin seçin. ortam değişkenine mongosh için PATH sonuç yolunu ekleyin.
    • Windows: MongoDB Kabuğu (mongosh.exe), C:\Users\user<\>AppData\Local\Programs\mongosh konumunda yüklenir. ortam değişkenine mongosh.exe için PATH sonuç yolunu ekleyin.
  2. MongoDB'yi indirin ve yükleyin:

    • macOS/Linux: Genellikle /usr/local/mongodb içinde MongoDB'nin yüklendiği dizini doğrulayın. ortam değişkenine mongodb için PATH sonuç yolunu ekleyin.
    • Windows: MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\binPATH.
  3. Veri Depolama Dizini seçin: Verileri depolamak için geliştirme makinenizde bir dizin seçin. Yoksa dizini oluşturun. MongoDB Kabuğu yeni dizinler oluşturmaz:

    • macOS/Linux: Örneğin, /usr/local/var/mongodb.
    • Windows: Örneğin, C:\\BooksData.
  4. İşletim sistemi komut kabuğunda (MongoDB Kabuğu değil), varsayılan bağlantı noktası 27017'de MongoDB'ye bağlanmak için aşağıdaki komutu kullanın. <data_directory_path> değerini önceki adımda seçilen dizinle değiştirin.

    mongod --dbpath <data_directory_path>
    

Veritabanı oluşturmak, koleksiyonlar yapmak ve belgeleri depolamak için aşağıdaki adımlarda daha önce yüklenmiş mongoDB kabuğunu kullanın. MongoDB Kabuğu komutları hakkında daha fazla bilgi için bkz mongosh.

  1. komutunu başlatarak mongosh.exeveya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:

    mongosh
    
  2. Komut kabuğunda şu komutu çalıştırarak varsayılan test veritabanına bağlanın:

    use BookStore
    

    BookStore adlı bir veritabanı henüz yoksa oluşturulur. Veritabanı mevcutsa, işlemler için bağlantısı açılır.

  3. Aşağıdaki komutu kullanarak koleksiyon Books oluşturun:

    db.createCollection('Books')
    

    Aşağıdaki sonuç görüntülenir:

    { "ok" : 1 }
    
  4. Koleksiyon için Books bir şema tanımlayın ve aşağıdaki komutu kullanarak iki belge ekleyin:

    db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("61a6058e6c43f32854e51f51"),
            ObjectId("61a6058e6c43f32854e51f52")
         ]
     }
    

    Not

    ObjectIdÖnceki sonuçta gösterilenler, komut kabuğunda gösterilenlerle eşleşmez.

  5. Aşağıdaki komutu kullanarak veritabanındaki belgeleri görüntüleyin:

    db.Books.find().pretty()
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
         "_id" : ObjectId("61a6058e6c43f32854e51f51"),
         "Name" : "Design Patterns",
         "Price" : 54.93,
         "Category" : "Computers",
         "Author" : "Ralph Johnson"
     }
     {
         "_id" : ObjectId("61a6058e6c43f32854e51f52"),
         "Name" : "Clean Code",
         "Price" : 43.15,
         "Category" : "Computers",
         "Author" : "Robert C. Martin"
     }
    

    Şema, her belge için otomatik olarak oluşturulan türü _id bir ObjectId özelliği ekler.

ASP.NET Core web API projesini oluşturma

  1. Dosya gidin.

  2. ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.

  3. Projeye BookStoreApi adını verin ve İleri'yi seçin.

  4. .NET 8.0 (Uzun Vadeli destek) çerçevesini seçin ve Oluştur'u seçin.

  5. Paket Yöneticisi Konsolu penceresinde proje köküne gidin. MongoDB için .NET sürücüsünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-Package MongoDB.Driver
    

Varlık modeli ekleme

  1. Proje köküne models dizini ekleyin.

  2. Book dizinine aşağıdaki kodla bir sınıf ekleyin:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace BookStoreApi.Models;
    
    public class Book
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string? Id { get; set; }
    
        [BsonElement("Name")]
        public string BookName { get; set; } = null!;
    
        public decimal Price { get; set; }
    
        public string Category { get; set; } = null!;
    
        public string Author { get; set; } = null!;
    }
    

    Önceki sınıfta Id özelliği şöyledir:

    • Ortak Dil Çalışma Zamanı (CLR) nesnesini MongoDB koleksiyonuna eşlemek için gereklidir.
    • Bu özelliği belgenin birincil anahtarı yapmak için [BsonId] ile anotasyon yapıldı.
    • parametresinin ObjectId[BsonRepresentation(BsonType.ObjectId)]yapısı yerine tür string olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'den string öğesine dönüştürmeyi ObjectIdişler.

    BookName özelliğine özniteliğiyle [BsonElement] ek açıklama eklenir. özniteliğinin değeri Name MongoDB koleksiyonundaki özellik adını temsil eder.

Yapılandırma modeli ekleme

  1. aşağıdaki veritabanı yapılandırma değerlerini içine appsettings.jsonekleyin:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. BookStoreDatabaseSettings dizinine aşağıdaki kodla bir sınıf ekleyin:

    namespace BookStoreApi.Models;
    
    public class BookStoreDatabaseSettings
    {
        public string ConnectionString { get; set; } = null!;
    
        public string DatabaseName { get; set; } = null!;
    
        public string BooksCollectionName { get; set; } = null!;
    }
    

    Önceki BookStoreDatabaseSettings sınıf, dosyanın appsettings.json özellik değerlerini depolamak BookStoreDatabase için kullanılır. Eşleme işlemini kolaylaştırmak için JSON ve C# özellik adları aynı şekilde adlandırılır.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    

    Yukarıdaki kodda, dosyanın appsettings.json bölümünün bağlandığı BookStoreDatabase yapılandırma örneği Bağımlılık Ekleme (DI) kapsayıcısına kaydedilir. Örneğin, nesnesinin BookStoreDatabaseSettingsConnectionString özelliği içindeki BookStoreDatabase:ConnectionStringözelliğiyle appsettings.json doldurulur.

  4. Program.cs üst kısmına şu kodu ekleyerek BookStoreDatabaseSettings referansını çözün:

    using BookStoreApi.Models;
    

CRUD işlem hizmeti ekleme

  1. Proje köküne bir Services dizini ekleyin.

  2. Services dizinine aşağıdaki kodla bir BooksService sınıf ekleyin:

    using BookStoreApi.Models;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    
    namespace BookStoreApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                bookStoreDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                bookStoreDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                bookStoreDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    

    Önceki kodda, bir BookStoreDatabaseSettings örneği oluşturucu enjeksiyonu yoluyla DI'den alınır. Bu teknik, Yapılandırma appsettings.json bölümünde eklenen yapılandırma değerlerine erişim sağlar.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    

    Yukarıdaki kodda BooksService sınıfı, kullanan sınıflarda oluşturucu eklemeyi desteklemek için DI ile kaydedilir. Tekil hizmet ömrü en uygun olandır çünkü BooksService, MongoClient üzerinde doğrudan bağımlıdır. Resmi Mongo İstemcisi yeniden kullanım yönergeleri uyarınca, MongoClient tekil hizmet ömrüyle DI'ye kaydedilmelidir.

  4. Program.cs üst kısmına şu kodu ekleyerek BooksService referansını çözün:

    using BookStoreApi.Services;
    

sınıfı, BooksService veritabanında CRUD işlemlerini çalıştırmak için aşağıdaki MongoDB.Driver üyeleri kullanır:

  • MongoClient: Veritabanı işlemlerini çalıştırmak için sunucu örneğini okur. Bu sınıfın oluşturucusu, MongoDB bağlantı dizesi içinde bulunur.

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: çalıştırma işlemleri için Mongo veritabanını temsil eder. Bu öğreticide, belirli bir koleksiyondaki verilere erişim elde etmek için arabirimdeki genel GetCollection<TDocument>(koleksiyon) yöntemi kullanılır. Bu yöntem çağrıldıktan sonra koleksiyona karşı CRUD işlemlerini çalıştırın. GetCollection<TDocument>(collection) yöntem çağrısında:

    • collection koleksiyon adını temsil eder.
    • TDocument koleksiyonda depolanan CLR nesne türünü temsil eder.

GetCollection<TDocument>(collection) , koleksiyonu temsil eden bir MongoCollection nesnesi döndürür. Bu öğreticide, koleksiyondaki yöntemler aşağıdaki şekilde çağrılacak:

  • DeleteOneAsync: Sağlanan arama ölçütleriyle eşleşen tek bir belgeyi siler.
  • Bulmak<TDocument>: Koleksiyondaki sağlanan arama ölçütleriyle eşleşen tüm belgeleri döndürür.
  • InsertOneAsync: Sağlanan nesneyi koleksiyona yeni bir belge olarak ekler.
  • ReplaceOneAsync: Sağlanan arama ölçütleriyle eşleşen tek belgeyi sağlanan nesneyle değiştirir.

Denetleyici ekleme

BooksController dizinine aşağıdaki kodla bir sınıf ekleyin:

using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;

namespace BookStoreApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
    private readonly BooksService _booksService;

    public BooksController(BooksService booksService) =>
        _booksService = booksService;

    [HttpGet]
    public async Task<List<Book>> Get() =>
        await _booksService.GetAsync();

    [HttpGet("{id:length(24)}")]
    public async Task<ActionResult<Book>> Get(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        return book;
    }

    [HttpPost]
    public async Task<IActionResult> Post(Book newBook)
    {
        await _booksService.CreateAsync(newBook);

        return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
    }

    [HttpPut("{id:length(24)}")]
    public async Task<IActionResult> Update(string id, Book updatedBook)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

    [HttpDelete("{id:length(24)}")]
    public async Task<IActionResult> Delete(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

Önceki web API'si denetleyicisi:

  • CRUD işlemlerini çalıştırmak için sınıfını BooksService kullanır.
  • GET, POST, PUT ve DELETE HTTP isteklerini desteklemek için eylem yöntemleri içerir.
  • CreatedAtAction Create yanıtı döndürmek için eylem yönteminde çağrılar. Durum kodu 201, sunucuda yeni bir kaynak oluşturan bir HTTP POST yöntemi için standart yanıttır. CreatedAtAction ayrıca yanıta bir Location üst bilgi ekler. Başlık, Location yeni oluşturulan kitabın URI'sini belirtir.

Web API'sini test edin

  1. Uygulamayı derleyin ve çalıştırın.

  2. https://localhost:<port>/api/booksDenetleyicinin parametresiz <port> eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olan Get konumuna gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. https://localhost:<port>/api/books/{id here} Denetleyicinin aşırı yüklenmiş Get eylem yöntemini test etmek için adresine gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    {
      "id": "61a6058e6c43f32854e51f52",
      "bookName": "Clean Code",
      "price": 43.15,
      "category": "Computers",
      "author": "Robert C. Martin"
    }
    

JSON serileştirme seçeneklerini yapılandırma

Web API'sini test etme bölümünde döndürülen JSON yanıtları hakkında değiştirecek iki ayrıntı vardır:

  • Özellik adlarının varsayılan deve sırtı yazımı, CLR nesnesinin özellik adlarının Pascal durumuyla eşleşecek şekilde değiştirilmelidir.
  • bookName özelliği Name olarak döndürülmelidir.

Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:

  1. Program.cs içinde, aşağıdaki vurgulanmış kodu AddControllers yöntemi çağrısına zincirleyin.

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    
    builder.Services.AddControllers()
        .AddJsonOptions(
            options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
    

    Yukarıdaki değişiklikle, web API'sinin serileştirilmiş JSON yanıtlarındaki özellik adları CLR nesne türündeki ilgili özellik adlarıyla eşleşmektedir. Örneğin, Book sınıfının Author özelliği, Author yerine author olarak serileştirilir.

  2. Models/Book.cs içinde, BookName özelliğine [JsonPropertyName] özniteliği ekleyin.

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    [JsonPropertyName] özniteliğinin değeriName, web API'sinin serileştirilmiş JSON yanıtında özellik adını temsil eder.

  3. Models/Book.cs'nın üst kısmına aşağıdaki kodu ekleyin [JsonProperty] öznitelik başvurusunu çözmek için:

    using System.Text.Json.Serialization;
    
  4. Web API'sini test et bölümünde tanımlanan adımları yineleyin. JSON özellik adlarındaki farka dikkat edin.

Web API'sine kimlik doğrulaması desteği ekleme

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Önemli

Duende Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.

Daha fazla bilgi için Duende Server belgelerine Identity bakın.

Ek kaynaklar

Bu öğretici, MongoDB NoSQL veritabanında Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) işlemlerini çalıştıran bir web API'sini oluşturur.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • MongoDB'yi yapılandırma
  • MongoDB veritabanı oluşturma
  • MongoDB koleksiyonu ve şeması tanımlama
  • Web API'sinden MongoDB CRUD işlemleri gerçekleştirme
  • JSON serileştirmeyi özelleştirme

Önkoşullar

MongoDB'yi yapılandırma

Geliştirme makinesinin herhangi bir yerinden MongoDB ve MongoDB Kabuk erişimini etkinleştirin:

  1. Windows'da MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\binPATH.

  2. MongoDB Shell'i indirin ve çıkartmak için bir dizin seçin. ortam değişkenine mongosh.exe için PATH sonuç yolunu ekleyin.

  3. Verileri depolamak için geliştirme makinesinde bir dizin seçin. Örneğin, Windows üzerinde C:\BooksData . Yoksa dizini oluşturun. Mongo Shell yeni dizinler oluşturmaz.

  4. İşletim sistemi komut kabuğunda (MongoDB Kabuğu değil), varsayılan bağlantı noktası 27017'de MongoDB'ye bağlanmak için aşağıdaki komutu kullanın. <data_directory_path> değerini önceki adımda seçilen dizinle değiştirin.

    mongod --dbpath <data_directory_path>
    

Veritabanı oluşturmak, koleksiyonlar yapmak ve belgeleri depolamak için aşağıdaki adımlarda daha önce yüklenmiş mongoDB kabuğunu kullanın. MongoDB Kabuğu komutları hakkında daha fazla bilgi için bkz mongosh.

  1. komutunu başlatarak mongosh.exeveya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:

    mongosh
    
  2. Komut kabuğunda şu komutu çalıştırarak varsayılan test veritabanına bağlanın:

    use BookStore
    

    BookStore adlı bir veritabanı henüz yoksa oluşturulur. Veritabanı mevcutsa, işlemler için bağlantısı açılır.

  3. Aşağıdaki komutu kullanarak koleksiyon Books oluşturun:

    db.createCollection('Books')
    

    Aşağıdaki sonuç görüntülenir:

    { "ok" : 1 }
    
  4. Koleksiyon için Books bir şema tanımlayın ve aşağıdaki komutu kullanarak iki belge ekleyin:

    db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("61a6058e6c43f32854e51f51"),
            ObjectId("61a6058e6c43f32854e51f52")
         ]
     }
    

    Not

    ObjectIdÖnceki sonuçta gösterilenler, komut kabuğunda gösterilenlerle eşleşmez.

  5. Aşağıdaki komutu kullanarak veritabanındaki belgeleri görüntüleyin:

    db.Books.find().pretty()
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
         "_id" : ObjectId("61a6058e6c43f32854e51f51"),
         "Name" : "Design Patterns",
         "Price" : 54.93,
         "Category" : "Computers",
         "Author" : "Ralph Johnson"
     }
     {
         "_id" : ObjectId("61a6058e6c43f32854e51f52"),
         "Name" : "Clean Code",
         "Price" : 43.15,
         "Category" : "Computers",
         "Author" : "Robert C. Martin"
     }
    

    Şema, her belge için otomatik olarak oluşturulan türü _id bir ObjectId özelliği ekler.

ASP.NET Core web API projesini oluşturma

  1. Dosya gidin.

  2. ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.

  3. Projeye BookStoreApi adını verin ve İleri'yi seçin.

  4. .NET 7.0 (Standart Terim Desteği) çerçevesini seçin ve Oluştur'u seçin.

  5. Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi>Konsolu'nu seçin.

  6. Paket Yöneticisi Konsolu penceresinde proje köküne gidin. MongoDB için .NET sürücüsünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-Package MongoDB.Driver
    

Varlık modeli ekleme

  1. Proje köküne models dizini ekleyin.

  2. Book dizinine aşağıdaki kodla bir sınıf ekleyin:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace BookStoreApi.Models;
    
    public class Book
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string? Id { get; set; }
    
        [BsonElement("Name")]
        public string BookName { get; set; } = null!;
    
        public decimal Price { get; set; }
    
        public string Category { get; set; } = null!;
    
        public string Author { get; set; } = null!;
    }
    

    Önceki sınıfta Id özelliği şöyledir:

    • Ortak Dil Çalışma Zamanı (CLR) nesnesini MongoDB koleksiyonuna eşlemek için gereklidir.
    • Bu özelliği belgenin birincil anahtarı yapmak için [BsonId] ile anotasyon yapıldı.
    • parametresinin ObjectId[BsonRepresentation(BsonType.ObjectId)]yapısı yerine tür string olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'den string öğesine dönüştürmeyi ObjectIdişler.

    BookName özelliğine özniteliğiyle [BsonElement] ek açıklama eklenir. özniteliğinin değeri Name MongoDB koleksiyonundaki özellik adını temsil eder.

Yapılandırma modeli ekleme

  1. aşağıdaki veritabanı yapılandırma değerlerini içine appsettings.jsonekleyin:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. BookStoreDatabaseSettings dizinine aşağıdaki kodla bir sınıf ekleyin:

    namespace BookStoreApi.Models;
    
    public class BookStoreDatabaseSettings
    {
        public string ConnectionString { get; set; } = null!;
    
        public string DatabaseName { get; set; } = null!;
    
        public string BooksCollectionName { get; set; } = null!;
    }
    

    Önceki BookStoreDatabaseSettings sınıf, dosyanın appsettings.json özellik değerlerini depolamak BookStoreDatabase için kullanılır. Eşleme işlemini kolaylaştırmak için JSON ve C# özellik adları aynı şekilde adlandırılır.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    

    Yukarıdaki kodda, dosyanın appsettings.json bölümünün bağlandığı BookStoreDatabase yapılandırma örneği Bağımlılık Ekleme (DI) kapsayıcısına kaydedilir. Örneğin, nesnesinin BookStoreDatabaseSettingsConnectionString özelliği içindeki BookStoreDatabase:ConnectionStringözelliğiyle appsettings.json doldurulur.

  4. Program.cs üst kısmına şu kodu ekleyerek BookStoreDatabaseSettings referansını çözün:

    using BookStoreApi.Models;
    

CRUD işlem hizmeti ekleme

  1. Proje köküne bir Services dizini ekleyin.

  2. Services dizinine aşağıdaki kodla bir BooksService sınıf ekleyin:

    using BookStoreApi.Models;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    
    namespace BookStoreApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                bookStoreDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                bookStoreDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                bookStoreDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    

    Önceki kodda, bir BookStoreDatabaseSettings örneği oluşturucu enjeksiyonu yoluyla DI'den alınır. Bu teknik, Yapılandırma appsettings.json bölümünde eklenen yapılandırma değerlerine erişim sağlar.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    

    Yukarıdaki kodda BooksService sınıfı, kullanan sınıflarda oluşturucu eklemeyi desteklemek için DI ile kaydedilir. Tekil hizmet ömrü en uygun olandır çünkü BooksService, MongoClient üzerinde doğrudan bağımlıdır. Resmi Mongo İstemcisi yeniden kullanım yönergeleri uyarınca, MongoClient tekil hizmet ömrüyle DI'ye kaydedilmelidir.

  4. Program.cs üst kısmına şu kodu ekleyerek BooksService referansını çözün:

    using BookStoreApi.Services;
    

sınıfı, BooksService veritabanında CRUD işlemlerini çalıştırmak için aşağıdaki MongoDB.Driver üyeleri kullanır:

  • MongoClient: Veritabanı işlemlerini çalıştırmak için sunucu örneğini okur. Bu sınıfın oluşturucusunun MongoDB bağlantı dizesi sağlanır:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: çalıştırma işlemleri için Mongo veritabanını temsil eder. Bu öğreticide, belirli bir koleksiyondaki verilere erişim elde etmek için arabirimdeki genel GetCollection<TDocument>(koleksiyon) yöntemi kullanılır. Bu yöntem çağrıldıktan sonra koleksiyona karşı CRUD işlemlerini çalıştırın. GetCollection<TDocument>(collection) yöntem çağrısında:

    • collection koleksiyon adını temsil eder.
    • TDocument koleksiyonda depolanan CLR nesne türünü temsil eder.

GetCollection<TDocument>(collection) , koleksiyonu temsil eden bir MongoCollection nesnesi döndürür. Bu öğreticide, koleksiyondaki yöntemler aşağıdaki şekilde çağrılacak:

  • DeleteOneAsync: Sağlanan arama ölçütleriyle eşleşen tek bir belgeyi siler.
  • Bulmak<TDocument>: Koleksiyondaki sağlanan arama ölçütleriyle eşleşen tüm belgeleri döndürür.
  • InsertOneAsync: Sağlanan nesneyi koleksiyona yeni bir belge olarak ekler.
  • ReplaceOneAsync: Sağlanan arama ölçütleriyle eşleşen tek belgeyi sağlanan nesneyle değiştirir.

Denetleyici ekleme

BooksController dizinine aşağıdaki kodla bir sınıf ekleyin:

using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;

namespace BookStoreApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
    private readonly BooksService _booksService;

    public BooksController(BooksService booksService) =>
        _booksService = booksService;

    [HttpGet]
    public async Task<List<Book>> Get() =>
        await _booksService.GetAsync();

    [HttpGet("{id:length(24)}")]
    public async Task<ActionResult<Book>> Get(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        return book;
    }

    [HttpPost]
    public async Task<IActionResult> Post(Book newBook)
    {
        await _booksService.CreateAsync(newBook);

        return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
    }

    [HttpPut("{id:length(24)}")]
    public async Task<IActionResult> Update(string id, Book updatedBook)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

    [HttpDelete("{id:length(24)}")]
    public async Task<IActionResult> Delete(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

Önceki web API'si denetleyicisi:

  • CRUD işlemlerini çalıştırmak için sınıfını BooksService kullanır.
  • GET, POST, PUT ve DELETE HTTP isteklerini desteklemek için eylem yöntemleri içerir.
  • CreatedAtAction Create yanıtı döndürmek için eylem yönteminde çağrılar. Durum kodu 201, sunucuda yeni bir kaynak oluşturan bir HTTP POST yöntemi için standart yanıttır. CreatedAtAction ayrıca yanıta bir Location üst bilgi ekler. Başlık, Location yeni oluşturulan kitabın URI'sini belirtir.

Web API'sini test edin

  1. Uygulamayı derleyin ve çalıştırın.

  2. https://localhost:<port>/api/booksDenetleyicinin parametresiz <port> eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olan Get konumuna gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. https://localhost:<port>/api/books/{id here} Denetleyicinin aşırı yüklenmiş Get eylem yöntemini test etmek için adresine gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    {
      "id": "61a6058e6c43f32854e51f52",
      "bookName": "Clean Code",
      "price": 43.15,
      "category": "Computers",
      "author": "Robert C. Martin"
    }
    

JSON serileştirme seçeneklerini yapılandırma

Web API'sini test etme bölümünde döndürülen JSON yanıtları hakkında değiştirecek iki ayrıntı vardır:

  • Özellik adlarının varsayılan deve sırtı yazımı, CLR nesnesinin özellik adlarının Pascal durumuyla eşleşecek şekilde değiştirilmelidir.
  • bookName özelliği Name olarak döndürülmelidir.

Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:

  1. Program.cs içinde, aşağıdaki vurgulanmış kodu AddControllers yöntemi çağrısına zincirleyin.

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    
    builder.Services.AddControllers()
        .AddJsonOptions(
            options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
    

    Yukarıdaki değişiklikle, web API'sinin serileştirilmiş JSON yanıtlarındaki özellik adları CLR nesne türündeki ilgili özellik adlarıyla eşleşmektedir. Örneğin, Book sınıfının Author özelliği, Author yerine author olarak serileştirilir.

  2. Models/Book.cs içinde, BookName özelliğine [JsonPropertyName] özniteliği ekleyin.

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    [JsonPropertyName] özniteliğinin değeriName, web API'sinin serileştirilmiş JSON yanıtında özellik adını temsil eder.

  3. Models/Book.cs'nın üst kısmına aşağıdaki kodu ekleyin [JsonProperty] öznitelik başvurusunu çözmek için:

    using System.Text.Json.Serialization;
    
  4. Web API'sini test et bölümünde tanımlanan adımları yineleyin. JSON özellik adlarındaki farka dikkat edin.

Web API'sine kimlik doğrulaması desteği ekleme

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Önemli

Duende Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.

Daha fazla bilgi için Duende Server belgelerine Identity bakın.

Ek kaynaklar

Bu öğretici, MongoDB NoSQL veritabanında Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) işlemlerini çalıştıran bir web API'sini oluşturur.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • MongoDB'yi yapılandırma
  • MongoDB veritabanı oluşturma
  • MongoDB koleksiyonu ve şeması tanımlama
  • Web API'sinden MongoDB CRUD işlemleri gerçekleştirme
  • JSON serileştirmeyi özelleştirme

Önkoşullar

MongoDB'yi yapılandırma

Geliştirme makinesinin herhangi bir yerinden MongoDB ve MongoDB Kabuk erişimini etkinleştirin:

  1. Windows'da MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\binPATH.

  2. MongoDB Shell'i indirin ve çıkartmak için bir dizin seçin. ortam değişkenine mongosh.exe için PATH sonuç yolunu ekleyin.

  3. Verileri depolamak için geliştirme makinesinde bir dizin seçin. Örneğin, Windows üzerinde C:\BooksData . Yoksa dizini oluşturun. Mongo Shell yeni dizinler oluşturmaz.

  4. İşletim sistemi komut kabuğunda (MongoDB Kabuğu değil), varsayılan bağlantı noktası 27017'de MongoDB'ye bağlanmak için aşağıdaki komutu kullanın. <data_directory_path> değerini önceki adımda seçilen dizinle değiştirin.

    mongod --dbpath <data_directory_path>
    

Veritabanı oluşturmak, koleksiyonlar yapmak ve belgeleri depolamak için aşağıdaki adımlarda daha önce yüklenmiş mongoDB kabuğunu kullanın. MongoDB Kabuğu komutları hakkında daha fazla bilgi için bkz mongosh.

  1. komutunu başlatarak mongosh.exeveya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:

    mongosh
    
  2. Komut kabuğunda şu komutu çalıştırarak varsayılan test veritabanına bağlanın:

    use BookStore
    

    BookStore adlı bir veritabanı henüz yoksa oluşturulur. Veritabanı mevcutsa, işlemler için bağlantısı açılır.

  3. Aşağıdaki komutu kullanarak koleksiyon Books oluşturun:

    db.createCollection('Books')
    

    Aşağıdaki sonuç görüntülenir:

    { "ok" : 1 }
    
  4. Koleksiyon için Books bir şema tanımlayın ve aşağıdaki komutu kullanarak iki belge ekleyin:

    db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("61a6058e6c43f32854e51f51"),
            ObjectId("61a6058e6c43f32854e51f52")
         ]
     }
    

    Not

    ObjectIdÖnceki sonuçta gösterilenler, komut kabuğunda gösterilenlerle eşleşmez.

  5. Aşağıdaki komutu kullanarak veritabanındaki belgeleri görüntüleyin:

    db.Books.find().pretty()
    

    Aşağıdakine benzer bir sonuç görüntülenir:

    {
         "_id" : ObjectId("61a6058e6c43f32854e51f51"),
         "Name" : "Design Patterns",
         "Price" : 54.93,
         "Category" : "Computers",
         "Author" : "Ralph Johnson"
     }
     {
         "_id" : ObjectId("61a6058e6c43f32854e51f52"),
         "Name" : "Clean Code",
         "Price" : 43.15,
         "Category" : "Computers",
         "Author" : "Robert C. Martin"
     }
    

    Şema, her belge için otomatik olarak oluşturulan türü _id bir ObjectId özelliği ekler.

ASP.NET Core web API projesini oluşturma

  1. Dosya gidin.

  2. ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.

  3. Projeye BookStoreApi adını verin ve İleri'yi seçin.

  4. .NET 6.0 (Uzun süreli destek) çerçevesini seçin ve Oluştur'u seçin.

  5. Paket Yöneticisi Konsolu penceresinde proje köküne gidin. MongoDB için .NET sürücüsünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-Package MongoDB.Driver
    

Varlık modeli ekleme

  1. Proje köküne models dizini ekleyin.

  2. Book dizinine aşağıdaki kodla bir sınıf ekleyin:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace BookStoreApi.Models;
    
    public class Book
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string? Id { get; set; }
    
        [BsonElement("Name")]
        public string BookName { get; set; } = null!;
    
        public decimal Price { get; set; }
    
        public string Category { get; set; } = null!;
    
        public string Author { get; set; } = null!;
    }
    

    Önceki sınıfta Id özelliği şöyledir:

    • Ortak Dil Çalışma Zamanı (CLR) nesnesini MongoDB koleksiyonuna eşlemek için gereklidir.
    • Bu özelliği belgenin birincil anahtarı yapmak için [BsonId] ile anotasyon yapıldı.
    • parametresinin ObjectId[BsonRepresentation(BsonType.ObjectId)]yapısı yerine tür string olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'den string öğesine dönüştürmeyi ObjectIdişler.

    BookName özelliğine özniteliğiyle [BsonElement] ek açıklama eklenir. özniteliğinin değeri Name MongoDB koleksiyonundaki özellik adını temsil eder.

Yapılandırma modeli ekleme

  1. aşağıdaki veritabanı yapılandırma değerlerini içine appsettings.jsonekleyin:

    {
        "BookStoreDatabase": {
            "ConnectionString": "mongodb://localhost:27017",
            "DatabaseName": "BookStore",
            "BooksCollectionName": "Books"
        },
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "AllowedHosts": "*"
    }
    
  2. BookStoreDatabaseSettings dizinine aşağıdaki kodla bir sınıf ekleyin:

    namespace BookStoreApi.Models;
    
    public class BookStoreDatabaseSettings
    {
        public string ConnectionString { get; set; } = null!;
    
        public string DatabaseName { get; set; } = null!;
    
        public string BooksCollectionName { get; set; } = null!;
    }
    

    Önceki BookStoreDatabaseSettings sınıf, dosyanın appsettings.json özellik değerlerini depolamak BookStoreDatabase için kullanılır. Eşleme işlemini kolaylaştırmak için JSON ve C# özellik adları aynı şekilde adlandırılır.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    

    Yukarıdaki kodda, dosyanın appsettings.json bölümünün bağlandığı BookStoreDatabase yapılandırma örneği Bağımlılık Ekleme (DI) kapsayıcısına kaydedilir. Örneğin, nesnesinin BookStoreDatabaseSettingsConnectionString özelliği içindeki BookStoreDatabase:ConnectionStringözelliğiyle appsettings.json doldurulur.

  4. Program.cs üst kısmına şu kodu ekleyerek BookStoreDatabaseSettings referansını çözün:

    using BookStoreApi.Models;
    

CRUD işlem hizmeti ekleme

  1. Proje köküne bir Services dizini ekleyin.

  2. Services dizinine aşağıdaki kodla bir BooksService sınıf ekleyin:

    using BookStoreApi.Models;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    
    namespace BookStoreApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                bookStoreDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                bookStoreDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                bookStoreDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    

    Önceki kodda, bir BookStoreDatabaseSettings örneği oluşturucu enjeksiyonu yoluyla DI'den alınır. Bu teknik, Yapılandırma appsettings.json bölümünde eklenen yapılandırma değerlerine erişim sağlar.

  3. aşağıdaki vurgulanmış kodu içine Program.csekleyin:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    

    Yukarıdaki kodda BooksService sınıfı, kullanan sınıflarda oluşturucu eklemeyi desteklemek için DI ile kaydedilir. Tekil hizmet ömrü en uygun olandır çünkü BooksService, MongoClient üzerinde doğrudan bağımlıdır. Resmi Mongo İstemcisi yeniden kullanım yönergeleri uyarınca, MongoClient tekil hizmet ömrüyle DI'ye kaydedilmelidir.

  4. Program.cs üst kısmına şu kodu ekleyerek BooksService referansını çözün:

    using BookStoreApi.Services;
    

sınıfı, BooksService veritabanında CRUD işlemlerini çalıştırmak için aşağıdaki MongoDB.Driver üyeleri kullanır:

  • MongoClient: Veritabanı işlemlerini çalıştırmak için sunucu örneğini okur. Bu sınıfın oluşturucusunun MongoDB bağlantı dizesi sağlanır:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: çalıştırma işlemleri için Mongo veritabanını temsil eder. Bu öğreticide, belirli bir koleksiyondaki verilere erişim elde etmek için arabirimdeki genel GetCollection<TDocument>(koleksiyon) yöntemi kullanılır. Bu yöntem çağrıldıktan sonra koleksiyona karşı CRUD işlemlerini çalıştırın. GetCollection<TDocument>(collection) yöntem çağrısında:

    • collection koleksiyon adını temsil eder.
    • TDocument koleksiyonda depolanan CLR nesne türünü temsil eder.

GetCollection<TDocument>(collection) , koleksiyonu temsil eden bir MongoCollection nesnesi döndürür. Bu öğreticide, koleksiyondaki yöntemler aşağıdaki şekilde çağrılacak:

  • DeleteOneAsync: Sağlanan arama ölçütleriyle eşleşen tek bir belgeyi siler.
  • Bulmak<TDocument>: Koleksiyondaki sağlanan arama ölçütleriyle eşleşen tüm belgeleri döndürür.
  • InsertOneAsync: Sağlanan nesneyi koleksiyona yeni bir belge olarak ekler.
  • ReplaceOneAsync: Sağlanan arama ölçütleriyle eşleşen tek belgeyi sağlanan nesneyle değiştirir.

Denetleyici ekleme

BooksController dizinine aşağıdaki kodla bir sınıf ekleyin:

using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;

namespace BookStoreApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
    private readonly BooksService _booksService;

    public BooksController(BooksService booksService) =>
        _booksService = booksService;

    [HttpGet]
    public async Task<List<Book>> Get() =>
        await _booksService.GetAsync();

    [HttpGet("{id:length(24)}")]
    public async Task<ActionResult<Book>> Get(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        return book;
    }

    [HttpPost]
    public async Task<IActionResult> Post(Book newBook)
    {
        await _booksService.CreateAsync(newBook);

        return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
    }

    [HttpPut("{id:length(24)}")]
    public async Task<IActionResult> Update(string id, Book updatedBook)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

    [HttpDelete("{id:length(24)}")]
    public async Task<IActionResult> Delete(string id)
    {
        var book = await _booksService.GetAsync(id);

        if (book is null)
        {
            return NotFound();
        }

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

Önceki web API'si denetleyicisi:

  • CRUD işlemlerini çalıştırmak için sınıfını BooksService kullanır.
  • GET, POST, PUT ve DELETE HTTP isteklerini desteklemek için eylem yöntemleri içerir.
  • CreatedAtAction Create yanıtı döndürmek için eylem yönteminde çağrılar. Durum kodu 201, sunucuda yeni bir kaynak oluşturan bir HTTP POST yöntemi için standart yanıttır. CreatedAtAction ayrıca yanıta bir Location üst bilgi ekler. Başlık, Location yeni oluşturulan kitabın URI'sini belirtir.

Web API'sini test edin

  1. Uygulamayı derleyin ve çalıştırın.

  2. https://localhost:<port>/api/booksDenetleyicinin parametresiz <port> eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olan Get konumuna gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. https://localhost:<port>/api/books/{id here} Denetleyicinin aşırı yüklenmiş Get eylem yöntemini test etmek için adresine gidin. Aşağıdakine benzer bir JSON yanıtı görüntülenir:

    {
      "id": "61a6058e6c43f32854e51f52",
      "bookName": "Clean Code",
      "price": 43.15,
      "category": "Computers",
      "author": "Robert C. Martin"
    }
    

JSON serileştirme seçeneklerini yapılandırma

Web API'sini test etme bölümünde döndürülen JSON yanıtları hakkında değiştirecek iki ayrıntı vardır:

  • Özellik adlarının varsayılan deve sırtı yazımı, CLR nesnesinin özellik adlarının Pascal durumuyla eşleşecek şekilde değiştirilmelidir.
  • bookName özelliği Name olarak döndürülmelidir.

Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:

  1. Program.cs içinde, aşağıdaki vurgulanmış kodu AddControllers yöntemi çağrısına zincirleyin.

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.Configure<BookStoreDatabaseSettings>(
        builder.Configuration.GetSection("BookStoreDatabase"));
    
    builder.Services.AddSingleton<BooksService>();
    
    builder.Services.AddControllers()
        .AddJsonOptions(
            options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
    

    Yukarıdaki değişiklikle, web API'sinin serileştirilmiş JSON yanıtlarındaki özellik adları CLR nesne türündeki ilgili özellik adlarıyla eşleşmektedir. Örneğin, Book sınıfının Author özelliği, Author yerine author olarak serileştirilir.

  2. Models/Book.cs içinde, BookName özelliğine [JsonPropertyName] özniteliği ekleyin.

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    [JsonPropertyName] özniteliğinin değeriName, web API'sinin serileştirilmiş JSON yanıtında özellik adını temsil eder.

  3. Models/Book.cs'nın üst kısmına aşağıdaki kodu ekleyin [JsonProperty] öznitelik başvurusunu çözmek için:

    using System.Text.Json.Serialization;
    
  4. Web API'sini test et bölümünde tanımlanan adımları yineleyin. JSON özellik adlarındaki farka dikkat edin.

Web API'sine kimlik doğrulaması desteği ekleme

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Önemli

Duende Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.

Daha fazla bilgi için Duende Server belgelerine Identity bakın.

Ek kaynaklar

Bu öğretici, MongoDB NoSQL veritabanında Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) işlemlerini çalıştıran bir web API'sini oluşturur.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • MongoDB'yi yapılandırma
  • MongoDB veritabanı oluşturma
  • MongoDB koleksiyonu ve şeması tanımlama
  • Web API'sinden MongoDB CRUD işlemleri gerçekleştirme
  • JSON serileştirmeyi özelleştirme

Örnek kodu görüntüleme veya indirme (indirme)

Önkoşullar

MongoDB'yi yapılandırma

Windows kullanılıyorsa MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\binPath. Bu değişiklik, mongoDB'ye geliştirme makinenizin her yerinden erişmesini sağlar.

Veritabanı oluşturmak, koleksiyonlar yapmak ve belgeleri depolamak için aşağıdaki adımlarda mongo Kabuğunu kullanın. mongo Shell komutları hakkında daha fazla bilgi için bkz. Mongo Kabuğu ile çalışma.

  1. Verileri depolamak için geliştirme makinenizde bir dizin seçin. Örneğin, Windows üzerinde C:\BooksData . Yoksa dizini oluşturun. Mongo Shell yeni dizinler oluşturmaz.

  2. Bir komut kabuğu açın. Varsayılan bağlantı noktası 27017'de MongoDB'ye bağlanmak için aşağıdaki komutu çalıştırın. <data_directory_path>'yi önceki adımda seçtiğiniz dizinle değiştirmeyi unutmayın.

    mongod --dbpath <data_directory_path>
    
  3. Başka bir komut kabuğu örneği açın. Aşağıdaki komutu çalıştırarak varsayılan test veritabanına bağlanın:

    mongo
    
  4. Komut kabuğunda aşağıdaki komutu çalıştırın:

    use BookstoreDb
    

    Eğer BookstoreDb adlı bir veritabanı henüz mevcut değilse, oluşturulur. Veritabanı mevcutsa, işlemler için bağlantısı açılır.

  5. Aşağıdaki komutu kullanarak koleksiyon Books oluşturun:

    db.createCollection('Books')
    

    Aşağıdaki sonuç görüntülenir:

    { "ok" : 1 }
    
  6. Koleksiyon için Books bir şema tanımlayın ve aşağıdaki komutu kullanarak iki belge ekleyin:

    db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}])
    

    Aşağıdaki sonuç görüntülenir:

    {
      "acknowledged" : true,
      "insertedIds" : [
        ObjectId("5bfd996f7b8e48dc15ff215d"),
        ObjectId("5bfd996f7b8e48dc15ff215e")
      ]
    }
    

    Not

    Bu örnekte gösterilen kimlikler, bu örneği çalıştırdığınızda kimliklerle eşleşmeyecektir.

  7. Aşağıdaki komutu kullanarak veritabanındaki belgeleri görüntüleyin:

    db.Books.find({}).pretty()
    

    Aşağıdaki sonuç görüntülenir:

    {
      "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
      "Name" : "Design Patterns",
      "Price" : 54.93,
      "Category" : "Computers",
      "Author" : "Ralph Johnson"
    }
    {
      "_id" : ObjectId("5bfd996f7b8e48dc15ff215e"),
      "Name" : "Clean Code",
      "Price" : 43.15,
      "Category" : "Computers",
      "Author" : "Robert C. Martin"
    }
    

    Şema, her belge için otomatik olarak oluşturulan türü _id bir ObjectId özelliği ekler.

Veritabanı hazır. ASP.NET Core web API'sini oluşturmaya başlayabilirsiniz.

ASP.NET Core web API projesini oluşturma

  1. Dosya gidin.

  2. ASP.NET Çekirdek Web Uygulaması proje türünü seçin ve İleri'yi seçin.

  3. Projeye BooksApi adını verin ve Oluştur'u seçin.

  4. .NET Core hedef çerçevesini ve ASP.NET Core 3.0'ı seçin. API proje şablonunu seçin ve Oluştur'u seçin.

  5. MongoDB için .NET sürücüsünün en son kararlı sürümünü belirlemek için NuGet Galerisi: MongoDB.Driver adresini ziyaret edin. Paket Yöneticisi Konsolu penceresinde proje köküne gidin. MongoDB için .NET sürücüsünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-Package MongoDB.Driver -Version {VERSION}
    

Varlık modeli ekleme

  1. Proje köküne models dizini ekleyin.

  2. Book dizinine aşağıdaki kodla bir sınıf ekleyin:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace BooksApi.Models
    {
        public class Book
        {
            [BsonId]
            [BsonRepresentation(BsonType.ObjectId)]
            public string Id { get; set; }
    
            [BsonElement("Name")]
            public string BookName { get; set; }
    
            public decimal Price { get; set; }
    
            public string Category { get; set; }
    
            public string Author { get; set; }
        }
    }
    

    Önceki sınıfta Id özelliği şöyledir:

    • Ortak Dil Çalışma Zamanı (CLR) nesnesini MongoDB koleksiyonuna eşlemek için gereklidir.
    • Bu özelliği belgenin birincil anahtarı yapmak için [BsonId] ile anotasyon yapıldı.
    • parametresinin ObjectId[BsonRepresentation(BsonType.ObjectId)]yapısı yerine tür string olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'den string öğesine dönüştürmeyi ObjectIdişler.

    BookName özelliğine özniteliğiyle [BsonElement] ek açıklama eklenir. özniteliğinin değeri Name MongoDB koleksiyonundaki özellik adını temsil eder.

Yapılandırma modeli ekleme

  1. aşağıdaki veritabanı yapılandırma değerlerini içine appsettings.jsonekleyin:

    {
      "BookstoreDatabaseSettings": {
        "BooksCollectionName": "Books",
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookstoreDb"
      },
      "Logging": {
        "IncludeScopes": false,
        "Debug": {
          "LogLevel": {
            "Default": "Warning"
          }
        },
        "Console": {
          "LogLevel": {
            "Default": "Warning"
          }
        }
      }
    }
    
  2. "C:\Modeller\ klasörüne aşağıdaki kodla bir BookstoreDatabaseSettings.cs dosyası ekleyin:"

    namespace BooksApi.Models
    {
        public class BookstoreDatabaseSettings : IBookstoreDatabaseSettings
        {
            public string BooksCollectionName { get; set; }
            public string ConnectionString { get; set; }
            public string DatabaseName { get; set; }
        }
    
        public interface IBookstoreDatabaseSettings
        {
            string BooksCollectionName { get; set; }
            string ConnectionString { get; set; }
            string DatabaseName { get; set; }
        }
    }
    

    Önceki BookstoreDatabaseSettings sınıf, dosyanın appsettings.json özellik değerlerini depolamak BookstoreDatabaseSettings için kullanılır. Eşleme işlemini kolaylaştırmak için JSON ve C# özellik adları aynı şekilde adlandırılır.

  3. aşağıdaki vurgulanmış kodu içine Startup.ConfigureServicesekleyin:

    public void ConfigureServices(IServiceCollection services)
    {
        // requires using Microsoft.Extensions.Options
        services.Configure<BookstoreDatabaseSettings>(
            Configuration.GetSection(nameof(BookstoreDatabaseSettings)));
    
        services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
            sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);
    
        services.AddControllers();
    }
    

    Önceki kodda:

    • Dosyanın appsettings.json bölümünün bağlandığı BookstoreDatabaseSettings yapılandırma örneği Bağımlılık Ekleme (DI) kapsayıcısına kaydedilir. Örneğin, bir BookstoreDatabaseSettings nesnenin ConnectionString özelliği, BookstoreDatabaseSettings:ConnectionString özelliğiyle appsettings.json doldurulur.
    • Arabirim IBookstoreDatabaseSettings , tek bir hizmet ömrüyle DI'ye kaydedilir. Enjekte edilen arabirim örneği bir BookstoreDatabaseSettings nesneye çözümlendi.
  4. Aşağıdaki kodu Startup.cs üst kısmına ekleyerek BookstoreDatabaseSettings ve IBookstoreDatabaseSettings referanslarını çözümleyin:

    using BooksApi.Models;
    

CRUD işlem hizmeti ekleme

  1. Proje köküne bir Services dizini ekleyin.

  2. Services dizinine aşağıdaki kodla bir BookService sınıf ekleyin:

    using BooksApi.Models;
    using MongoDB.Driver;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace BooksApi.Services
    {
        public class BookService
        {
            private readonly IMongoCollection<Book> _books;
    
            public BookService(IBookstoreDatabaseSettings settings)
            {
                var client = new MongoClient(settings.ConnectionString);
                var database = client.GetDatabase(settings.DatabaseName);
    
                _books = database.GetCollection<Book>(settings.BooksCollectionName);
            }
    
            public List<Book> Get() =>
                _books.Find(book => true).ToList();
    
            public Book Get(string id) =>
                _books.Find<Book>(book => book.Id == id).FirstOrDefault();
    
            public Book Create(Book book)
            {
                _books.InsertOne(book);
                return book;
            }
    
            public void Update(string id, Book bookIn) =>
                _books.ReplaceOne(book => book.Id == id, bookIn);
    
            public void Remove(Book bookIn) =>
                _books.DeleteOne(book => book.Id == bookIn.Id);
    
            public void Remove(string id) => 
                _books.DeleteOne(book => book.Id == id);
        }
    }
    

    Yukarıdaki kodda, bir IBookstoreDatabaseSettings örnek oluşturucu ekleme yoluyla DI'den alınır. Bu teknik, Yapılandırma appsettings.json bölümünde eklenen yapılandırma değerlerine erişim sağlar.

  3. aşağıdaki vurgulanmış kodu içine Startup.ConfigureServicesekleyin:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<BookstoreDatabaseSettings>(
            Configuration.GetSection(nameof(BookstoreDatabaseSettings)));
    
        services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
            sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);
    
        services.AddSingleton<BookService>();
    
        services.AddControllers();
    }
    

    Yukarıdaki kodda BookService sınıfı, kullanan sınıflarda oluşturucu eklemeyi desteklemek için DI ile kaydedilir. Tekil hizmet ömrü en uygun olandır çünkü BookService, MongoClient üzerinde doğrudan bağımlıdır. Resmi Mongo İstemcisi yeniden kullanım yönergeleri uyarınca, MongoClient tekil hizmet ömrüyle DI'ye kaydedilmelidir.

  4. Startup.cs üst kısmına şu kodu ekleyerek BookService referansını çözün:

    using BooksApi.Services;
    

sınıfı, BookService veritabanında CRUD işlemlerini çalıştırmak için aşağıdaki MongoDB.Driver üyeleri kullanır:

  • MongoClient: Veritabanı işlemlerini çalıştırmak için sunucu örneğini okur. Bu sınıfın oluşturucusunun MongoDB bağlantı dizesi sağlanır:

    public BookService(IBookstoreDatabaseSettings settings)
    {
        var client = new MongoClient(settings.ConnectionString);
        var database = client.GetDatabase(settings.DatabaseName);
    
        _books = database.GetCollection<Book>(settings.BooksCollectionName);
    }
    
  • IMongoDatabase: çalıştırma işlemleri için Mongo veritabanını temsil eder. Bu öğreticide, belirli bir koleksiyondaki verilere erişim elde etmek için arabirimdeki genel GetCollection<TDocument>(koleksiyon) yöntemi kullanılır. Bu yöntem çağrıldıktan sonra koleksiyona karşı CRUD işlemlerini çalıştırın. GetCollection<TDocument>(collection) yöntem çağrısında:

    • collection koleksiyon adını temsil eder.
    • TDocument koleksiyonda depolanan CLR nesne türünü temsil eder.

GetCollection<TDocument>(collection) , koleksiyonu temsil eden bir MongoCollection nesnesi döndürür. Bu öğreticide, koleksiyondaki yöntemler aşağıdaki şekilde çağrılacak:

  • DeleteOne: Sağlanan arama ölçütleriyle eşleşen tek bir belgeyi siler.
  • Bulmak<TDocument>: Koleksiyondaki sağlanan arama ölçütleriyle eşleşen tüm belgeleri döndürür.
  • InsertOne: Sağlanan nesneyi koleksiyona yeni bir belge olarak ekler.
  • ReplaceOne: Sağlanan arama ölçütleriyle eşleşen tek belgeyi sağlanan nesneyle değiştirir.

Denetleyici ekleme

BooksController dizinine aşağıdaki kodla bir sınıf ekleyin:

using BooksApi.Models;
using BooksApi.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace BooksApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class BooksController : ControllerBase
    {
        private readonly BookService _bookService;

        public BooksController(BookService bookService)
        {
            _bookService = bookService;
        }

        [HttpGet]
        public ActionResult<List<Book>> Get() =>
            _bookService.Get();

        [HttpGet("{id:length(24)}", Name = "GetBook")]
        public ActionResult<Book> Get(string id)
        {
            var book = _bookService.Get(id);

            if (book == null)
            {
                return NotFound();
            }

            return book;
        }

        [HttpPost]
        public ActionResult<Book> Create(Book book)
        {
            _bookService.Create(book);

            return CreatedAtRoute("GetBook", new { id = book.Id.ToString() }, book);
        }

        [HttpPut("{id:length(24)}")]
        public IActionResult Update(string id, Book bookIn)
        {
            var book = _bookService.Get(id);

            if (book == null)
            {
                return NotFound();
            }

            _bookService.Update(id, bookIn);

            return NoContent();
        }

        [HttpDelete("{id:length(24)}")]
        public IActionResult Delete(string id)
        {
            var book = _bookService.Get(id);

            if (book == null)
            {
                return NotFound();
            }

            _bookService.Remove(id);

            return NoContent();
        }
    }
}

Önceki web API'si denetleyicisi:

  • CRUD işlemlerini çalıştırmak için sınıfını BookService kullanır.
  • GET, POST, PUT ve DELETE HTTP isteklerini desteklemek için eylem yöntemleri içerir.
  • CreatedAtRoute Create yanıtı döndürmek için eylem yönteminde çağrılar. Durum kodu 201, sunucuda yeni bir kaynak oluşturan bir HTTP POST yöntemi için standart yanıttır. CreatedAtRoute ayrıca yanıta bir Location üst bilgi ekler. Başlık, Location yeni oluşturulan kitabın URI'sini belirtir.

Web API'sini test edin

  1. Uygulamayı derleyin ve çalıştırın.

  2. https://localhost:<port>/api/books Denetleyicinin parametresiz Get eylem yöntemini test etmek için adresine gidin. Aşağıdaki JSON yanıtı görüntülenir:

    [
      {
        "id":"5bfd996f7b8e48dc15ff215d",
        "bookName":"Design Patterns",
        "price":54.93,
        "category":"Computers",
        "author":"Ralph Johnson"
      },
      {
        "id":"5bfd996f7b8e48dc15ff215e",
        "bookName":"Clean Code",
        "price":43.15,
        "category":"Computers",
        "author":"Robert C. Martin"
      }
    ]
    
  3. https://localhost:<port>/api/books/{id here} Denetleyicinin aşırı yüklenmiş Get eylem yöntemini test etmek için adresine gidin. Aşağıdaki JSON yanıtı görüntülenir:

    {
      "id":"{ID}",
      "bookName":"Clean Code",
      "price":43.15,
      "category":"Computers",
      "author":"Robert C. Martin"
    }
    

JSON serileştirme seçeneklerini yapılandırma

Web API'sini test etme bölümünde döndürülen JSON yanıtları hakkında değiştirecek iki ayrıntı vardır:

  • Özellik adlarının varsayılan deve sırtı yazımı, CLR nesnesinin özellik adlarının Pascal durumuyla eşleşecek şekilde değiştirilmelidir.
  • bookName özelliği Name olarak döndürülmelidir.

Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:

  1. Json.NET ASP.NET paylaşılan çerçeveden kaldırılmıştır. Microsoft.AspNetCore.Mvc.NewtonsoftJson öğesine bir paket başvurusu ekleyin.

  2. Startup.ConfigureServices içinde, aşağıdaki vurgulanmış kodu AddControllers yöntemi çağrısına zincirleyin.

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<BookstoreDatabaseSettings>(
            Configuration.GetSection(nameof(BookstoreDatabaseSettings)));
    
        services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
            sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);
    
        services.AddSingleton<BookService>();
    
        services.AddControllers()
            .AddNewtonsoftJson(options => options.UseMemberCasing());
    }
    

    Yukarıdaki değişiklikle, web API'sinin serileştirilmiş JSON yanıtlarındaki özellik adları CLR nesne türündeki ilgili özellik adlarıyla eşleşmektedir. Örneğin, Book sınıfının Author özelliği Author olarak serileştirilir.

  3. Models/Book.cs içinde, BookName özelliğine, aşağıdaki [JsonProperty] özniteliği ile ek açıklama ekleyin.

    [BsonElement("Name")]
    [JsonProperty("Name")]
    public string BookName { get; set; }
    

    [JsonProperty] özniteliğinin değeriName, web API'sinin serileştirilmiş JSON yanıtında özellik adını temsil eder.

  4. Models/Book.cs'nın üst kısmına aşağıdaki kodu ekleyin [JsonProperty] öznitelik başvurusunu çözmek için:

    using Newtonsoft.Json;
    
  5. Web API'sini test et bölümünde tanımlanan adımları yineleyin. JSON özellik adlarındaki farka dikkat edin.

Web API'sine kimlik doğrulaması desteği ekleme

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende IdentityServer, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende IdentityServer aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Daha fazla bilgi için bkz. Duende IdentityServer'a Genel Bakış.

Diğer kimlik doğrulama sağlayıcıları hakkında daha fazla bilgi için bkz. ASP.NET Core için Topluluk İşletim Sistemi kimlik doğrulama seçenekleri

Sonraki adımlar

ASP.NET Core web API'leri oluşturma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: