Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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
ASP.NET ve web geliştirme iş yüküyle Visual Studio 2022.
MongoDB'yi yapılandırma
Geliştirme makinesinde (Windows/Linux/macOS) her yerden MongoDB ve MongoDB Kabuğu erişimini etkinleştirin:
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çinPATH
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çinPATH
sonuç yolunu ekleyin.
- macOS/Linux: MongoDB Kabuğunu ayıklamak için bir dizin seçin. ortam değişkenine
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çinPATH
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\bin
PATH
.
- macOS/Linux: Genellikle /usr/local/mongodb içinde MongoDB'nin yüklendiği dizini doğrulayın. ortam değişkenine
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
.
- macOS/Linux: Örneğin,
İş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
.
komutunu başlatarak
mongosh.exe
veya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:mongosh
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.
Aşağıdaki komutu kullanarak koleksiyon
Books
oluşturun:db.createCollection('Books')
Aşağıdaki sonuç görüntülenir:
{ "ok" : 1 }
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.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
birObjectId
özelliği ekler.
ASP.NET Core web API projesini oluşturma
- Dosya gidin.
- ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.
- Projeye BookStoreApi adını verin ve İleri'yi seçin.
- 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.
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
Proje köküne models dizini ekleyin.
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ürstring
olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'denstring
öğesine dönüştürmeyiObjectId
işler.
BookName
özelliğine özniteliğiyle[BsonElement]
ek açıklama eklenir. özniteliğinin değeriName
MongoDB koleksiyonundaki özellik adını temsil eder.
Yapılandırma modeli ekleme
aşağıdaki veritabanı yapılandırma değerlerini içine
appsettings.json
ekleyin:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
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ınappsettings.json
özellik değerlerini depolamakBookStoreDatabase
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.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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, nesnesininBookStoreDatabaseSettings
ConnectionString
özelliği içindekiBookStoreDatabase:ConnectionString
özelliğiyleappsettings.json
doldurulur.Program.cs
üst kısmına şu kodu ekleyerekBookStoreDatabaseSettings
referansını çözün:using BookStoreApi.Models;
CRUD işlem hizmeti ekleme
Proje köküne bir Services dizini ekleyin.
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ırmaappsettings.json
bölümünde eklenen yapılandırma değerlerine erişim sağlar.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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.Program.cs
üst kısmına şu kodu ekleyerekBooksService
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 birLocation
ü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ğiName
olarak döndürülmelidir.
Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:
Program.cs
içinde, aşağıdaki vurgulanmış koduAddControllers
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ınAuthor
özelliği,Author
yerineauthor
olarak serileştirilir.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.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;
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.
Uygulamayı derleyin ve çalıştırın.
Uç Nokta Gezgini'nde, ilk GET uç noktasına
/api/books
sağ 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.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.
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" } ]
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}} ###
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}} ###
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.
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" }
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 } ###
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" } ###
İ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.
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}} ###
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:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Sunucusu
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
ASP.NET ve web geliştirme iş yüküyle Visual Studio 2022.
MongoDB'yi yapılandırma
Geliştirme makinesinde (Windows/Linux/macOS) her yerden MongoDB ve MongoDB Kabuğu erişimini etkinleştirin:
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çinPATH
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çinPATH
sonuç yolunu ekleyin.
- macOS/Linux: MongoDB Kabuğunu ayıklamak için bir dizin seçin. ortam değişkenine
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çinPATH
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\bin
PATH
.
- macOS/Linux: Genellikle /usr/local/mongodb içinde MongoDB'nin yüklendiği dizini doğrulayın. ortam değişkenine
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
.
- macOS/Linux: Örneğin,
İş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
.
komutunu başlatarak
mongosh.exe
veya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:mongosh
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.
Aşağıdaki komutu kullanarak koleksiyon
Books
oluşturun:db.createCollection('Books')
Aşağıdaki sonuç görüntülenir:
{ "ok" : 1 }
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.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
birObjectId
özelliği ekler.
ASP.NET Core web API projesini oluşturma
Dosya gidin.
ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.
Projeye BookStoreApi adını verin ve İleri'yi seçin.
.NET 8.0 (Uzun Vadeli destek) çerçevesini seçin ve Oluştur'u seçin.
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
Proje köküne models dizini ekleyin.
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ürstring
olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'denstring
öğesine dönüştürmeyiObjectId
işler.
BookName
özelliğine özniteliğiyle[BsonElement]
ek açıklama eklenir. özniteliğinin değeriName
MongoDB koleksiyonundaki özellik adını temsil eder.
Yapılandırma modeli ekleme
aşağıdaki veritabanı yapılandırma değerlerini içine
appsettings.json
ekleyin:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
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ınappsettings.json
özellik değerlerini depolamakBookStoreDatabase
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.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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, nesnesininBookStoreDatabaseSettings
ConnectionString
özelliği içindekiBookStoreDatabase:ConnectionString
özelliğiyleappsettings.json
doldurulur.Program.cs
üst kısmına şu kodu ekleyerekBookStoreDatabaseSettings
referansını çözün:using BookStoreApi.Models;
CRUD işlem hizmeti ekleme
Proje köküne bir Services dizini ekleyin.
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ırmaappsettings.json
bölümünde eklenen yapılandırma değerlerine erişim sağlar.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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.Program.cs
üst kısmına şu kodu ekleyerekBooksService
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 birLocation
üst bilgi ekler. Başlık,Location
yeni oluşturulan kitabın URI'sini belirtir.
Web API'sini test edin
Uygulamayı derleyin ve çalıştırın.
https://localhost:<port>/api/books
Denetleyicinin parametresiz<port>
eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olanGet
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" } ]
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ğiName
olarak döndürülmelidir.
Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:
Program.cs
içinde, aşağıdaki vurgulanmış koduAddControllers
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ınAuthor
özelliği,Author
yerineauthor
olarak serileştirilir.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.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;
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:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Sunucusu
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
ASP.NET ve web geliştirme iş yüküyle Visual Studio 2022.
MongoDB'yi yapılandırma
Geliştirme makinesinin herhangi bir yerinden MongoDB ve MongoDB Kabuk erişimini etkinleştirin:
Windows'da MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\bin
PATH
.MongoDB Shell'i indirin ve çıkartmak için bir dizin seçin. ortam değişkenine
mongosh.exe
içinPATH
sonuç yolunu ekleyin.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.
İş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
.
komutunu başlatarak
mongosh.exe
veya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:mongosh
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.
Aşağıdaki komutu kullanarak koleksiyon
Books
oluşturun:db.createCollection('Books')
Aşağıdaki sonuç görüntülenir:
{ "ok" : 1 }
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.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
birObjectId
özelliği ekler.
ASP.NET Core web API projesini oluşturma
Dosya gidin.
ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.
Projeye BookStoreApi adını verin ve İleri'yi seçin.
.NET 7.0 (Standart Terim Desteği) çerçevesini seçin ve Oluştur'u seçin.
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi>Konsolu'nu seçin.
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
Proje köküne models dizini ekleyin.
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ürstring
olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'denstring
öğesine dönüştürmeyiObjectId
işler.
BookName
özelliğine özniteliğiyle[BsonElement]
ek açıklama eklenir. özniteliğinin değeriName
MongoDB koleksiyonundaki özellik adını temsil eder.
Yapılandırma modeli ekleme
aşağıdaki veritabanı yapılandırma değerlerini içine
appsettings.json
ekleyin:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
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ınappsettings.json
özellik değerlerini depolamakBookStoreDatabase
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.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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, nesnesininBookStoreDatabaseSettings
ConnectionString
özelliği içindekiBookStoreDatabase:ConnectionString
özelliğiyleappsettings.json
doldurulur.Program.cs
üst kısmına şu kodu ekleyerekBookStoreDatabaseSettings
referansını çözün:using BookStoreApi.Models;
CRUD işlem hizmeti ekleme
Proje köküne bir Services dizini ekleyin.
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ırmaappsettings.json
bölümünde eklenen yapılandırma değerlerine erişim sağlar.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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.Program.cs
üst kısmına şu kodu ekleyerekBooksService
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 birLocation
üst bilgi ekler. Başlık,Location
yeni oluşturulan kitabın URI'sini belirtir.
Web API'sini test edin
Uygulamayı derleyin ve çalıştırın.
https://localhost:<port>/api/books
Denetleyicinin parametresiz<port>
eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olanGet
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" } ]
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ğiName
olarak döndürülmelidir.
Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:
Program.cs
içinde, aşağıdaki vurgulanmış koduAddControllers
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ınAuthor
özelliği,Author
yerineauthor
olarak serileştirilir.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.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;
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:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Sunucusu
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
- ASP.NET ve web geliştirme iş yüküyle Visual Studio 2022.
- .NET 6 SDK
MongoDB'yi yapılandırma
Geliştirme makinesinin herhangi bir yerinden MongoDB ve MongoDB Kabuk erişimini etkinleştirin:
Windows'da MongoDB varsayılan olarak C:\Program Files\MongoDB konumunda yüklenir. Ortam değişkenine < C:\Program Files\MongoDB\Server\>version_number\bin
PATH
.MongoDB Shell'i indirin ve çıkartmak için bir dizin seçin. ortam değişkenine
mongosh.exe
içinPATH
sonuç yolunu ekleyin.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.
İş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
.
komutunu başlatarak
mongosh.exe
veya komut kabuğunda aşağıdaki komutu çalıştırarak bir MongoDB komut kabuğu örneği açın:mongosh
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.
Aşağıdaki komutu kullanarak koleksiyon
Books
oluşturun:db.createCollection('Books')
Aşağıdaki sonuç görüntülenir:
{ "ok" : 1 }
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.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
birObjectId
özelliği ekler.
ASP.NET Core web API projesini oluşturma
Dosya gidin.
ASP.NET Core Web API proje türünü seçin ve İleri'yi seçin.
Projeye BookStoreApi adını verin ve İleri'yi seçin.
.NET 6.0 (Uzun süreli destek) çerçevesini seçin ve Oluştur'u seçin.
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
Proje köküne models dizini ekleyin.
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ürstring
olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'denstring
öğesine dönüştürmeyiObjectId
işler.
BookName
özelliğine özniteliğiyle[BsonElement]
ek açıklama eklenir. özniteliğinin değeriName
MongoDB koleksiyonundaki özellik adını temsil eder.
Yapılandırma modeli ekleme
aşağıdaki veritabanı yapılandırma değerlerini içine
appsettings.json
ekleyin:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
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ınappsettings.json
özellik değerlerini depolamakBookStoreDatabase
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.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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, nesnesininBookStoreDatabaseSettings
ConnectionString
özelliği içindekiBookStoreDatabase:ConnectionString
özelliğiyleappsettings.json
doldurulur.Program.cs
üst kısmına şu kodu ekleyerekBookStoreDatabaseSettings
referansını çözün:using BookStoreApi.Models;
CRUD işlem hizmeti ekleme
Proje köküne bir Services dizini ekleyin.
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ırmaappsettings.json
bölümünde eklenen yapılandırma değerlerine erişim sağlar.aşağıdaki vurgulanmış kodu içine
Program.cs
ekleyin: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.Program.cs
üst kısmına şu kodu ekleyerekBooksService
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 birLocation
üst bilgi ekler. Başlık,Location
yeni oluşturulan kitabın URI'sini belirtir.
Web API'sini test edin
Uygulamayı derleyin ve çalıştırın.
https://localhost:<port>/api/books
Denetleyicinin parametresiz<port>
eylem yöntemini test etmek için, uygulaması için otomatik olarak atanan bağlantı noktası numarası olanGet
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" } ]
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ğiName
olarak döndürülmelidir.
Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:
Program.cs
içinde, aşağıdaki vurgulanmış koduAddControllers
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ınAuthor
özelliği,Author
yerineauthor
olarak serileştirilir.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.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;
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:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Sunucusu
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
- .NET Core SDK 3.0 veya üzeri
- ASP.NET ve web geliştirme iş yüküyle Visual Studio 2019
- MongoDB
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.
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.
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>
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
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.
Aşağıdaki komutu kullanarak koleksiyon
Books
oluşturun:db.createCollection('Books')
Aşağıdaki sonuç görüntülenir:
{ "ok" : 1 }
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.
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
birObjectId
özelliği ekler.
Veritabanı hazır. ASP.NET Core web API'sini oluşturmaya başlayabilirsiniz.
ASP.NET Core web API projesini oluşturma
Dosya gidin.
ASP.NET Çekirdek Web Uygulaması proje türünü seçin ve İleri'yi seçin.
Projeye BooksApi adını verin ve Oluştur'u seçin.
.NET Core hedef çerçevesini ve ASP.NET Core 3.0'ı seçin. API proje şablonunu seçin ve Oluştur'u seçin.
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
Proje köküne models dizini ekleyin.
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ürstring
olarak geçirilmesine izin vermek için ile ek açıklama eklenir. Mongo, 'denstring
öğesine dönüştürmeyiObjectId
işler.
BookName
özelliğine özniteliğiyle[BsonElement]
ek açıklama eklenir. özniteliğinin değeriName
MongoDB koleksiyonundaki özellik adını temsil eder.
Yapılandırma modeli ekleme
aşağıdaki veritabanı yapılandırma değerlerini içine
appsettings.json
ekleyin:{ "BookstoreDatabaseSettings": { "BooksCollectionName": "Books", "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookstoreDb" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } }
"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ınappsettings.json
özellik değerlerini depolamakBookstoreDatabaseSettings
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.aşağıdaki vurgulanmış kodu içine
Startup.ConfigureServices
ekleyin: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, birBookstoreDatabaseSettings
nesneninConnectionString
özelliği,BookstoreDatabaseSettings:ConnectionString
özelliğiyleappsettings.json
doldurulur. - Arabirim
IBookstoreDatabaseSettings
, tek bir hizmet ömrüyle DI'ye kaydedilir. Enjekte edilen arabirim örneği birBookstoreDatabaseSettings
nesneye çözümlendi.
- Dosyanın
Aşağıdaki kodu
Startup.cs
üst kısmına ekleyerekBookstoreDatabaseSettings
veIBookstoreDatabaseSettings
referanslarını çözümleyin:using BooksApi.Models;
CRUD işlem hizmeti ekleme
Proje köküne bir Services dizini ekleyin.
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ırmaappsettings.json
bölümünde eklenen yapılandırma değerlerine erişim sağlar.aşağıdaki vurgulanmış kodu içine
Startup.ConfigureServices
ekleyin: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.Startup.cs
üst kısmına şu kodu ekleyerekBookService
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 birLocation
üst bilgi ekler. Başlık,Location
yeni oluşturulan kitabın URI'sini belirtir.
Web API'sini test edin
Uygulamayı derleyin ve çalıştırın.
https://localhost:<port>/api/books
Denetleyicinin parametresizGet
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" } ]
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ğiName
olarak döndürülmelidir.
Önceki gereksinimleri karşılamak için aşağıdaki değişiklikleri yapın:
Json.NET ASP.NET paylaşılan çerçeveden kaldırılmıştır.
Microsoft.AspNetCore.Mvc.NewtonsoftJson
öğesine bir paket başvurusu ekleyin.Startup.ConfigureServices
içinde, aşağıdaki vurgulanmış koduAddControllers
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ınAuthor
özelliğiAuthor
olarak serileştirilir.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.Models/Book.cs
'nın üst kısmına aşağıdaki kodu ekleyin[JsonProperty]
öznitelik başvurusunu çözmek için:using Newtonsoft.Json;
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:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende IdentityServer. Duende IdentityServer üçüncü taraf üründür.
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:
ASP.NET Core