Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
Door Pratik Khandelwal en Scott Addie
In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.
In deze zelfstudie leert u het volgende:
- MongoDB configureren
- Een MongoDB-database maken
- Een MongoDB-verzameling en -schema definiëren
- MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
- JSON-serialisatie aanpassen
Vereiste voorwaarden
Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
MongoDB configureren
MongoDB- en MongoDB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen (Windows/Linux/macOS):
MongoDB Shell downloaden en installeren:
- macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor
mongosh
aan dePATH
omgevingsvariabele toe. - Windows: MongoDB Shell (mongosh.exe) is geïnstalleerd op C:\Users\user<\>AppData\Local\Programs\mongosh. Voeg het resulterende pad voor
mongosh.exe
aan dePATH
omgevingsvariabele toe.
- macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor
MongoDB downloaden en installeren:
- macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor
mongodb
aan dePATH
omgevingsvariabele toe. - Windows: MongoDB is standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de
PATH
omgevingsvariabele.
- macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor
Kies een gegevensopslagmap: selecteer een map op uw ontwikkelcomputer voor het opslaan van gegevens. Maak de map aan, als deze niet bestaat. Met de MongoDB-shell worden geen nieuwe mappen gemaakt:
- macOS/Linux: bijvoorbeeld
/usr/local/var/mongodb
. - Windows: bijvoorbeeld
C:\\BooksData
.
- macOS/Linux: bijvoorbeeld
Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang
<data_directory_path>
door de map die u in de vorige stap hebt gekozen.mongod --dbpath <data_directory_path>
Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh
.
Open een MongoDB-opdrachtshell-exemplaar door het starten
mongosh.exe
of door de volgende opdracht uit te voeren in de opdrachtshell:mongosh
Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:
use BookStore
Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.
Maak een
Books
verzameling met behulp van de volgende opdracht:db.createCollection('Books')
Het volgende resultaat wordt weergegeven:
{ "ok" : 1 }
Definieer een schema voor de
Books
verzameling en voeg twee documenten in met behulp van de volgende opdracht: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" }])
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Opmerking
De
ObjectId
in het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.Bekijk de documenten in de database met behulp van de volgende opdracht:
db.Books.find().pretty()
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "_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" }
Het schema voegt een automatisch gegenereerde
_id
eigenschap van het typeObjectId
toe voor elk document.
Het ASP.NET Core-web-API-project maken
- Ga naar Bestand>Nieuw>Project.
- Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.
- Geef het project de naam BookStoreApi en selecteer Volgende.
- In het dialoogvenster Aanvullende informatie:
- Controleer of de Framework is .NET 9.0 (Standaardterm Ondersteuning).
- Controleer of het selectievakje voor Controllers gebruiken is ingeschakeld.
- Controleer of het selectievakje voor OpenAPI-ondersteuning inschakelen is ingeschakeld.
- Klik op Creëren.
Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:
Install-Package MongoDB.Driver
Een entiteitsmodel toevoegen
Voeg een Models-map toe aan de hoofdmap van het project.
Voeg een
Book
klasse toe aan de map Modellen met de volgende code: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!; }
In de voorgaande klasse is de
Id
eigenschap:- Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
- Aangewezen met
[BsonId]
om van deze eigenschap de primaire sleutel van het document te maken. - Geannoteerd met
[BsonRepresentation(BsonType.ObjectId)]
zodat de parameter kan worden doorgegeven als typestring
in plaats van een ObjectId-structuur. Mongo verwerkt de conversie vanstring
naarObjectId
.
De
BookName
eigenschap wordt geannoteerd met het[BsonElement]
kenmerk. De waarde van het kenmerkName
vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.
Een configuratiemodel toevoegen
Voeg de volgende databaseconfiguratiewaarden toe aan
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
Voeg een
BookStoreDatabaseSettings
klasse toe aan de map Modellen met de volgende code:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
De voorgaande
BookStoreDatabaseSettings
klasse wordt gebruikt om de eigenschapswaarden vanappsettings.json
hetBookStoreDatabase
bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het
appsettings.json
bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. DeBookStoreDatabaseSettings
eigenschap van hetConnectionString
object wordt bijvoorbeeld gevuld met deBookStoreDatabase:ConnectionString
eigenschap inappsettings.json
.Voeg de volgende code toe bovenaan
Program.cs
om deBookStoreDatabaseSettings
verwijzing op te lossen:using BookStoreApi.Models;
Een CRUD-bewerkingsservice toevoegen
Voeg een Services-directory toe aan de hoofdmap van het project.
Voeg een
BooksService
klasse toe aan de Services directory met de volgende code: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); }
In de voorgaande code wordt een
BookStoreDatabaseSettings
exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot deappsettings.json
configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
In de voorgaande code wordt de
BooksService
klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdatBooksService
een directe afhankelijkheid vanMongoClient
heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moetMongoClient
worden geregistreerd in DI met een levensduur als een singleton-service.Voeg de volgende code toe bovenaan
Program.cs
om deBooksService
verwijzing op te lossen:using BookStoreApi.Services;
De BooksService
klasse gebruikt de volgende MongoDB.Driver
leden om CRUD-bewerkingen uit te voeren op de database:
MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd in de MongoDB-verbindingsreeks:
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: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de
GetCollection<TDocument>(collection)
methode-aanroep:-
collection
vertegenwoordigt de naam van de verzameling. -
TDocument
vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.
-
GetCollection<TDocument>(collection)
retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:
- DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
- Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
- InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
- ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.
Een controller toevoegen
Voeg een BooksController
klasse toe aan de map Controllers met de volgende code:
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();
}
}
De voorgaande web-API-controller:
- Gebruikt de
BooksService
klasse om CRUD-bewerkingen uit te voeren. - Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
- Roept CreatedAtAction de
Create
actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt.CreatedAtAction
voegt ook eenLocation
header toe aan het antwoord. DeLocation
header geeft de URI van het zojuist gemaakte boek op.
Opties voor JSON-serialisatie configureren
Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:
- De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
- De
bookName
eigenschap moet worden geretourneerd alsName
.
Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:
In
Program.cs
, schakel de volgende gemarkeerde code aan deAddControllers
methodeaanroep: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);
Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De
Book
-eigenschap van deAuthor
-klasse serialiseert bijvoorbeeld alsAuthor
in plaats vanauthor
.Annoteren in
Models/Book.cs
deBookName
eigenschap met het[JsonPropertyName]
kenmerk:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
De waarde van het
[JsonPropertyName]
kenmerkName
vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.Voeg de volgende code toe bovenaan
Models/Book.cs
om de[JsonProperty]
kenmerkreferentie op te lossen:using System.Text.Json.Serialization;
Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.
De web-API testen
In deze zelfstudie worden Endpoints Explorer- en HTTP-bestanden gebruikt om de API te testen.
Bouw en voer de app uit.
Klik in Endpoints Explorer met de rechtermuisknop op het eerste GET-eindpunt
/api/books
en selecteer Aanvraag genereren.De volgende inhoud wordt toegevoegd aan het
BookStoreApi.http
bestand. Als dit de eerste keer is dat een aanvraag wordt gegenereerd, wordt het bestand gemaakt in de hoofdmap van het project.@BookStoreApi_HostAddress = https://localhost:<port> GET {{BookStoreApi_HostAddress}}/api/books ###
Het poortnummer moet al zijn ingesteld op de poort die wordt gebruikt door de app,
https://localhost:56874
bijvoorbeeld. Als dat niet het geval is, kunt u uw poortnummer vinden in het uitvoervenster wanneer u de app start.Selecteer de koppeling Aanvraag verzenden boven de nieuwe
GET
aanvraagregel.De GET-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord .
In de hoofdtekst van het antwoord ziet u het JSON-resultaat met de boekvermeldingen die er ongeveer als volgt uitzien:
[ { "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" } ]
Als u één boek wilt ophalen, klikt u met de rechtermuisknop op het
/api/books/{id}, params (string id)
GET-eindpunt in Endpoints Explorer en selecteert u Een aanvraag genereren.De volgende inhoud wordt toegevoegd aan het
BookStoreApi.http
bestand:@id=string GET {{BookStoreApi_HostAddress}}/api/books/{{id}} ###
Vervang
id
de variabele door een van de id's die zijn geretourneerd door de eerdere aanvraag, bijvoorbeeld:@id="61a6058e6c43f32854e51f52" GET {{BookStoreApi_HostAddress}}/api/books/{{id}} ###
Selecteer de koppeling Aanvraag verzenden boven de nieuwe
GET
aanvraagregel.De GET-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord .
In de hoofdtekst van het antwoord ziet u JSON die vergelijkbaar is met het volgende:
{ "Id": "61a6058e6c43f32854e51f52", "Name": "Clean Code", "Price": 43.15, "Category": "Computers", "Author": "Robert C. Martin" }
Als u het POST-eindpunt wilt testen, klikt u met de rechtermuisknop op het
/api/books
POST-eindpunt en selecteert u Aanvraag genereren.De volgende inhoud wordt toegevoegd aan het
BookStoreApi.http
-bestand:POST {{BookStoreApi_HostAddress}}/api/books Content-Type: application/json { //Book } ###
Vervang de opmerking Boek door een boekobject als de hoofdtekst van de JSON-aanvraag:
POST {{BookStoreApi_HostAddress}}/api/books Content-Type: application/json { "Name": "The Pragmatic Programmer", "Price": 49.99, "Category": "Computers", "Author": "Andy Hunt" } ###
Selecteer de koppeling Aanvraag verzenden boven de
POST
aanvraagregel.De POST-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord . Het antwoord moet het zojuist gemaakte boek bevatten met de toegewezen ID.
Als u ten slotte een boek wilt verwijderen, klikt u met de rechtermuisknop op het
/api/books/{id}, params (string id)
eindpunt VERWIJDEREN en selecteert u Aanvraag genereren.De volgende inhoud wordt toegevoegd aan het
BookStoreApi.http
bestand:DELETE {{BookStoreApi_HostAddress}}/api/Books/{{id}} ###
Vervang de
id
variabele door een van de id's die zijn geretourneerd uit de eerdere aanvraag en klik op Aanvraag verzenden. Voorbeeld:DELETE {{BookStoreApi_HostAddress}}/api/Books/67f417517ce1b36aeab71236 ###
Verificatieondersteuning toevoegen aan een web-API
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Belangrijk
Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.
Aanvullende bronnen
In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.
In deze zelfstudie leert u het volgende:
- MongoDB configureren
- Een MongoDB-database maken
- Een MongoDB-verzameling en -schema definiëren
- MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
- JSON-serialisatie aanpassen
Vereiste voorwaarden
Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
MongoDB configureren
MongoDB- en MongoDB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen (Windows/Linux/macOS):
MongoDB Shell downloaden en installeren:
- macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor
mongosh
aan dePATH
omgevingsvariabele toe. - Windows: MongoDB Shell (mongosh.exe) is geïnstalleerd op C:\Users\user<\>AppData\Local\Programs\mongosh. Voeg het resulterende pad voor
mongosh.exe
aan dePATH
omgevingsvariabele toe.
- macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor
MongoDB downloaden en installeren:
- macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor
mongodb
aan dePATH
omgevingsvariabele toe. - Windows: MongoDB is standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de
PATH
omgevingsvariabele.
- macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor
Kies een gegevensopslagmap: selecteer een map op uw ontwikkelcomputer voor het opslaan van gegevens. Maak de map aan, als deze niet bestaat. Met de MongoDB-shell worden geen nieuwe mappen gemaakt:
- macOS/Linux: bijvoorbeeld
/usr/local/var/mongodb
. - Windows: bijvoorbeeld
C:\\BooksData
.
- macOS/Linux: bijvoorbeeld
Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang
<data_directory_path>
door de map die u in de vorige stap hebt gekozen.mongod --dbpath <data_directory_path>
Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh
.
Open een MongoDB-opdrachtshell-exemplaar door het starten
mongosh.exe
of door de volgende opdracht uit te voeren in de opdrachtshell:mongosh
Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:
use BookStore
Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.
Maak een
Books
verzameling met behulp van de volgende opdracht:db.createCollection('Books')
Het volgende resultaat wordt weergegeven:
{ "ok" : 1 }
Definieer een schema voor de
Books
verzameling en voeg twee documenten in met behulp van de volgende opdracht: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" }])
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Opmerking
De
ObjectId
in het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.Bekijk de documenten in de database met behulp van de volgende opdracht:
db.Books.find().pretty()
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "_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" }
Het schema voegt een automatisch gegenereerde
_id
eigenschap van het typeObjectId
toe voor elk document.
Het ASP.NET Core-web-API-project maken
Ga naar Bestand>Nieuw>Project.
Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.
Geef het project de naam BookStoreApi en selecteer Volgende.
Selecteer het framework voor .NET 8.0 (langetermijnondersteuning) en selecteer Maken.
Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:
Install-Package MongoDB.Driver
Een entiteitsmodel toevoegen
Voeg een Models-map toe aan de hoofdmap van het project.
Voeg een
Book
klasse toe aan de map Modellen met de volgende code: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!; }
In de voorgaande klasse is de
Id
eigenschap:- Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
- Aangewezen met
[BsonId]
om van deze eigenschap de primaire sleutel van het document te maken. - Geannoteerd met
[BsonRepresentation(BsonType.ObjectId)]
zodat de parameter kan worden doorgegeven als typestring
in plaats van een ObjectId-structuur. Mongo verwerkt de conversie vanstring
naarObjectId
.
De
BookName
eigenschap wordt geannoteerd met het[BsonElement]
kenmerk. De waarde van het kenmerkName
vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.
Een configuratiemodel toevoegen
Voeg de volgende databaseconfiguratiewaarden toe aan
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
Voeg een
BookStoreDatabaseSettings
klasse toe aan de map Modellen met de volgende code:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
De voorgaande
BookStoreDatabaseSettings
klasse wordt gebruikt om de eigenschapswaarden vanappsettings.json
hetBookStoreDatabase
bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het
appsettings.json
bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. DeBookStoreDatabaseSettings
eigenschap van hetConnectionString
object wordt bijvoorbeeld gevuld met deBookStoreDatabase:ConnectionString
eigenschap inappsettings.json
.Voeg de volgende code toe bovenaan
Program.cs
om deBookStoreDatabaseSettings
verwijzing op te lossen:using BookStoreApi.Models;
Een CRUD-bewerkingsservice toevoegen
Voeg een Services-directory toe aan de hoofdmap van het project.
Voeg een
BooksService
klasse toe aan de Services directory met de volgende code: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); }
In de voorgaande code wordt een
BookStoreDatabaseSettings
exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot deappsettings.json
configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
In de voorgaande code wordt de
BooksService
klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdatBooksService
een directe afhankelijkheid vanMongoClient
heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moetMongoClient
worden geregistreerd in DI met een levensduur als een singleton-service.Voeg de volgende code toe bovenaan
Program.cs
om deBooksService
verwijzing op te lossen:using BookStoreApi.Services;
De BooksService
klasse gebruikt de volgende MongoDB.Driver
leden om CRUD-bewerkingen uit te voeren op de database:
MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd in de MongoDB-verbindingsreeks:
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: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de
GetCollection<TDocument>(collection)
methode-aanroep:-
collection
vertegenwoordigt de naam van de verzameling. -
TDocument
vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.
-
GetCollection<TDocument>(collection)
retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:
- DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
- Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
- InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
- ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.
Een controller toevoegen
Voeg een BooksController
klasse toe aan de map Controllers met de volgende code:
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();
}
}
De voorgaande web-API-controller:
- Gebruikt de
BooksService
klasse om CRUD-bewerkingen uit te voeren. - Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
- Roept CreatedAtAction de
Create
actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt.CreatedAtAction
voegt ook eenLocation
header toe aan het antwoord. DeLocation
header geeft de URI van het zojuist gemaakte boek op.
De web-API testen
Bouw en voer de app uit.
Navigeer naar
https://localhost:<port>/api/books
, waar<port>
is het automatisch toegewezen poortnummer voor de app, om de parameterlozeGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:[ { "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" } ]
Navigeer naar
https://localhost:<port>/api/books/{id here}
om de overbelasteGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Opties voor JSON-serialisatie configureren
Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:
- De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
- De
bookName
eigenschap moet worden geretourneerd alsName
.
Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:
In
Program.cs
, schakel de volgende gemarkeerde code aan deAddControllers
methodeaanroep: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);
Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De
Book
-eigenschap van deAuthor
-klasse serialiseert bijvoorbeeld alsAuthor
in plaats vanauthor
.Annoteren in
Models/Book.cs
deBookName
eigenschap met het[JsonPropertyName]
kenmerk:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
De waarde van het
[JsonPropertyName]
kenmerkName
vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.Voeg de volgende code toe bovenaan
Models/Book.cs
om de[JsonProperty]
kenmerkreferentie op te lossen:using System.Text.Json.Serialization;
Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.
Verificatieondersteuning toevoegen aan een web-API
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Belangrijk
Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.
Aanvullende bronnen
In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.
In deze zelfstudie leert u het volgende:
- MongoDB configureren
- Een MongoDB-database maken
- Een MongoDB-verzameling en -schema definiëren
- MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
- JSON-serialisatie aanpassen
Vereiste voorwaarden
Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
MongoDB configureren
MongoDB- en Mongo DB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen:
In Windows wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de
PATH
omgevingsvariabele.Download de MongoDB Shell en kies een map om deze uit te pakken. Voeg het resulterende pad voor
mongosh.exe
aan dePATH
omgevingsvariabele toe.Kies een map op de ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.
Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang
<data_directory_path>
door de map die u in de vorige stap hebt gekozen.mongod --dbpath <data_directory_path>
Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh
.
Open een MongoDB-opdrachtshell-exemplaar door het starten
mongosh.exe
of door de volgende opdracht uit te voeren in de opdrachtshell:mongosh
Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:
use BookStore
Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.
Maak een
Books
verzameling met behulp van de volgende opdracht:db.createCollection('Books')
Het volgende resultaat wordt weergegeven:
{ "ok" : 1 }
Definieer een schema voor de
Books
verzameling en voeg twee documenten in met behulp van de volgende opdracht: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" }])
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Opmerking
De
ObjectId
in het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.Bekijk de documenten in de database met behulp van de volgende opdracht:
db.Books.find().pretty()
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "_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" }
Het schema voegt een automatisch gegenereerde
_id
eigenschap van het typeObjectId
toe voor elk document.
Het ASP.NET Core-web-API-project maken
Ga naar Bestand>Nieuw>Project.
Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.
Geef het project de naam BookStoreApi en selecteer Volgende.
Selecteer het framework .NET 7.0 (Standard Term Support) en selecteer Maken.
Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.
Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:
Install-Package MongoDB.Driver
Een entiteitsmodel toevoegen
Voeg een Models-map toe aan de hoofdmap van het project.
Voeg een
Book
klasse toe aan de map Modellen met de volgende code: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!; }
In de voorgaande klasse is de
Id
eigenschap:- Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
- Aangewezen met
[BsonId]
om van deze eigenschap de primaire sleutel van het document te maken. - Geannoteerd met
[BsonRepresentation(BsonType.ObjectId)]
zodat de parameter kan worden doorgegeven als typestring
in plaats van een ObjectId-structuur. Mongo verwerkt de conversie vanstring
naarObjectId
.
De
BookName
eigenschap wordt geannoteerd met het[BsonElement]
kenmerk. De waarde van het kenmerkName
vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.
Een configuratiemodel toevoegen
Voeg de volgende databaseconfiguratiewaarden toe aan
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
Voeg een
BookStoreDatabaseSettings
klasse toe aan de map Modellen met de volgende code:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
De voorgaande
BookStoreDatabaseSettings
klasse wordt gebruikt om de eigenschapswaarden vanappsettings.json
hetBookStoreDatabase
bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het
appsettings.json
bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. DeBookStoreDatabaseSettings
eigenschap van hetConnectionString
object wordt bijvoorbeeld gevuld met deBookStoreDatabase:ConnectionString
eigenschap inappsettings.json
.Voeg de volgende code toe bovenaan
Program.cs
om deBookStoreDatabaseSettings
verwijzing op te lossen:using BookStoreApi.Models;
Een CRUD-bewerkingsservice toevoegen
Voeg een Services-directory toe aan de hoofdmap van het project.
Voeg een
BooksService
klasse toe aan de Services directory met de volgende code: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); }
In de voorgaande code wordt een
BookStoreDatabaseSettings
exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot deappsettings.json
configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
In de voorgaande code wordt de
BooksService
klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdatBooksService
een directe afhankelijkheid vanMongoClient
heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moetMongoClient
worden geregistreerd in DI met een levensduur als een singleton-service.Voeg de volgende code toe bovenaan
Program.cs
om deBooksService
verwijzing op te lossen:using BookStoreApi.Services;
De BooksService
klasse gebruikt de volgende MongoDB.Driver
leden om CRUD-bewerkingen uit te voeren op de database:
MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:
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: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de
GetCollection<TDocument>(collection)
methode-aanroep:-
collection
vertegenwoordigt de naam van de verzameling. -
TDocument
vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.
-
GetCollection<TDocument>(collection)
retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:
- DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
- Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
- InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
- ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.
Een controller toevoegen
Voeg een BooksController
klasse toe aan de map Controllers met de volgende code:
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();
}
}
De voorgaande web-API-controller:
- Gebruikt de
BooksService
klasse om CRUD-bewerkingen uit te voeren. - Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
- Roept CreatedAtAction de
Create
actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt.CreatedAtAction
voegt ook eenLocation
header toe aan het antwoord. DeLocation
header geeft de URI van het zojuist gemaakte boek op.
De web-API testen
Bouw en voer de app uit.
Navigeer naar
https://localhost:<port>/api/books
, waar<port>
is het automatisch toegewezen poortnummer voor de app, om de parameterlozeGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:[ { "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" } ]
Navigeer naar
https://localhost:<port>/api/books/{id here}
om de overbelasteGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Opties voor JSON-serialisatie configureren
Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:
- De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
- De
bookName
eigenschap moet worden geretourneerd alsName
.
Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:
In
Program.cs
, schakel de volgende gemarkeerde code aan deAddControllers
methodeaanroep: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);
Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De
Book
-eigenschap van deAuthor
-klasse serialiseert bijvoorbeeld alsAuthor
in plaats vanauthor
.Annoteren in
Models/Book.cs
deBookName
eigenschap met het[JsonPropertyName]
kenmerk:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
De waarde van het
[JsonPropertyName]
kenmerkName
vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.Voeg de volgende code toe bovenaan
Models/Book.cs
om de[JsonProperty]
kenmerkreferentie op te lossen:using System.Text.Json.Serialization;
Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.
Verificatieondersteuning toevoegen aan een web-API
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Belangrijk
Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.
Aanvullende bronnen
In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.
In deze zelfstudie leert u het volgende:
- MongoDB configureren
- Een MongoDB-database maken
- Een MongoDB-verzameling en -schema definiëren
- MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
- JSON-serialisatie aanpassen
Vereiste voorwaarden
- Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
- .NET 6 SDK
MongoDB configureren
MongoDB- en Mongo DB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen:
In Windows wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de
PATH
omgevingsvariabele.Download de MongoDB Shell en kies een map om deze uit te pakken. Voeg het resulterende pad voor
mongosh.exe
aan dePATH
omgevingsvariabele toe.Kies een map op de ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.
Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang
<data_directory_path>
door de map die u in de vorige stap hebt gekozen.mongod --dbpath <data_directory_path>
Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh
.
Open een MongoDB-opdrachtshell-exemplaar door het starten
mongosh.exe
of door de volgende opdracht uit te voeren in de opdrachtshell:mongosh
Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:
use BookStore
Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.
Maak een
Books
verzameling met behulp van de volgende opdracht:db.createCollection('Books')
Het volgende resultaat wordt weergegeven:
{ "ok" : 1 }
Definieer een schema voor de
Books
verzameling en voeg twee documenten in met behulp van de volgende opdracht: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" }])
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Opmerking
De
ObjectId
in het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.Bekijk de documenten in de database met behulp van de volgende opdracht:
db.Books.find().pretty()
Er wordt een resultaat weergegeven dat lijkt op het volgende:
{ "_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" }
Het schema voegt een automatisch gegenereerde
_id
eigenschap van het typeObjectId
toe voor elk document.
Het ASP.NET Core-web-API-project maken
Ga naar Bestand>Nieuw>Project.
Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.
Geef het project de naam BookStoreApi en selecteer Volgende.
Selecteer het framework voor .NET 6.0 (langetermijnondersteuning) en selecteer Maken.
Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:
Install-Package MongoDB.Driver
Een entiteitsmodel toevoegen
Voeg een Models-map toe aan de hoofdmap van het project.
Voeg een
Book
klasse toe aan de map Modellen met de volgende code: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!; }
In de voorgaande klasse is de
Id
eigenschap:- Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
- Aangewezen met
[BsonId]
om van deze eigenschap de primaire sleutel van het document te maken. - Geannoteerd met
[BsonRepresentation(BsonType.ObjectId)]
zodat de parameter kan worden doorgegeven als typestring
in plaats van een ObjectId-structuur. Mongo verwerkt de conversie vanstring
naarObjectId
.
De
BookName
eigenschap wordt geannoteerd met het[BsonElement]
kenmerk. De waarde van het kenmerkName
vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.
Een configuratiemodel toevoegen
Voeg de volgende databaseconfiguratiewaarden toe aan
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
Voeg een
BookStoreDatabaseSettings
klasse toe aan de map Modellen met de volgende code:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
De voorgaande
BookStoreDatabaseSettings
klasse wordt gebruikt om de eigenschapswaarden vanappsettings.json
hetBookStoreDatabase
bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het
appsettings.json
bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. DeBookStoreDatabaseSettings
eigenschap van hetConnectionString
object wordt bijvoorbeeld gevuld met deBookStoreDatabase:ConnectionString
eigenschap inappsettings.json
.Voeg de volgende code toe bovenaan
Program.cs
om deBookStoreDatabaseSettings
verwijzing op te lossen:using BookStoreApi.Models;
Een CRUD-bewerkingsservice toevoegen
Voeg een Services-directory toe aan de hoofdmap van het project.
Voeg een
BooksService
klasse toe aan de Services directory met de volgende code: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); }
In de voorgaande code wordt een
BookStoreDatabaseSettings
exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot deappsettings.json
configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .Voeg de volgende gemarkeerde code toe aan
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
In de voorgaande code wordt de
BooksService
klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdatBooksService
een directe afhankelijkheid vanMongoClient
heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moetMongoClient
worden geregistreerd in DI met een levensduur als een singleton-service.Voeg de volgende code toe bovenaan
Program.cs
om deBooksService
verwijzing op te lossen:using BookStoreApi.Services;
De BooksService
klasse gebruikt de volgende MongoDB.Driver
leden om CRUD-bewerkingen uit te voeren op de database:
MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:
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: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de
GetCollection<TDocument>(collection)
methode-aanroep:-
collection
vertegenwoordigt de naam van de verzameling. -
TDocument
vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.
-
GetCollection<TDocument>(collection)
retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:
- DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
- Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
- InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
- ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.
Een controller toevoegen
Voeg een BooksController
klasse toe aan de map Controllers met de volgende code:
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();
}
}
De voorgaande web-API-controller:
- Gebruikt de
BooksService
klasse om CRUD-bewerkingen uit te voeren. - Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
- Roept CreatedAtAction de
Create
actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt.CreatedAtAction
voegt ook eenLocation
header toe aan het antwoord. DeLocation
header geeft de URI van het zojuist gemaakte boek op.
De web-API testen
Bouw en voer de app uit.
Navigeer naar
https://localhost:<port>/api/books
, waar<port>
is het automatisch toegewezen poortnummer voor de app, om de parameterlozeGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:[ { "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" } ]
Navigeer naar
https://localhost:<port>/api/books/{id here}
om de overbelasteGet
actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Opties voor JSON-serialisatie configureren
Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:
- De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
- De
bookName
eigenschap moet worden geretourneerd alsName
.
Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:
In
Program.cs
, schakel de volgende gemarkeerde code aan deAddControllers
methodeaanroep: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);
Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De
Book
-eigenschap van deAuthor
-klasse serialiseert bijvoorbeeld alsAuthor
in plaats vanauthor
.Annoteren in
Models/Book.cs
deBookName
eigenschap met het[JsonPropertyName]
kenmerk:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
De waarde van het
[JsonPropertyName]
kenmerkName
vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.Voeg de volgende code toe bovenaan
Models/Book.cs
om de[JsonProperty]
kenmerkreferentie op te lossen:using System.Text.Json.Serialization;
Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.
Verificatieondersteuning toevoegen aan een web-API
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Belangrijk
Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.
Aanvullende bronnen
In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.
In deze zelfstudie leert u het volgende:
- MongoDB configureren
- Een MongoDB-database maken
- Een MongoDB-verzameling en -schema definiëren
- MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
- JSON-serialisatie aanpassen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
- .NET Core SDK 3.0 of hoger
- Visual Studio 2019 met de workload voor ASP.NET en webontwikkeling
- MongoDB
MongoDB configureren
Als u Windows gebruikt, wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de Path
omgevingsvariabele. Met deze wijziging is MongoDB-toegang vanaf elke locatie op uw ontwikkelcomputer mogelijk.
Gebruik de Mongo Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie Werken met mongo Shell-opdrachten voor meer informatie over mongo Shell-opdrachten.
Kies een map op uw ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.
Open een opdrachtprompt. Voer de volgende opdracht uit om verbinding te maken met MongoDB op standaardpoort 27017. Vergeet niet om
<data_directory_path>
te vervangen door de map die u in de vorige stap hebt gekozen.mongod --dbpath <data_directory_path>
Open een andere instantie van de opdrachtprompt. Maak verbinding met de standaardtestdatabase door de volgende opdracht uit te voeren:
mongo
Voer de volgende opdracht uit in een opdrachtshell:
use BookstoreDb
Er wordt een database met de naam BookstoreDb gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.
Maak een
Books
verzameling met behulp van de volgende opdracht:db.createCollection('Books')
Het volgende resultaat wordt weergegeven:
{ "ok" : 1 }
Definieer een schema voor de
Books
verzameling en voeg twee documenten in met behulp van de volgende opdracht: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'}])
Het volgende resultaat wordt weergegeven:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
Opmerking
De id's die in dit artikel worden weergegeven, komen niet overeen met de id's wanneer u dit voorbeeld uitvoert.
Bekijk de documenten in de database met behulp van de volgende opdracht:
db.Books.find({}).pretty()
Het volgende resultaat wordt weergegeven:
{ "_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" }
Het schema voegt een automatisch gegenereerde
_id
eigenschap van het typeObjectId
toe voor elk document.
De database is gereed. U kunt beginnen met het maken van de ASP.NET Core-web-API.
Het ASP.NET Core-web-API-project maken
Ga naar Bestand>Nieuw>Project.
Selecteer het projecttype ASP.NET Core Web Application en selecteer Volgende.
Geef het project de naam BooksApi en selecteer Maken.
Selecteer het .NET Core-doelframework en ASP.NET Core 3.0. Selecteer het API projectsjabloon en klik op Maken.
Ga naar de NuGet Gallery: MongoDB.Driver om de meest recente stabiele versie van het .NET-stuurprogramma voor MongoDB te bepalen. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:
Install-Package MongoDB.Driver -Version {VERSION}
Een entiteitsmodel toevoegen
Voeg een Models-map toe aan de hoofdmap van het project.
Voeg een
Book
klasse toe aan de map Modellen met de volgende code: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; } } }
In de voorgaande klasse is de
Id
eigenschap:- Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
- Aangewezen met
[BsonId]
om van deze eigenschap de primaire sleutel van het document te maken. - Geannoteerd met
[BsonRepresentation(BsonType.ObjectId)]
zodat de parameter kan worden doorgegeven als typestring
in plaats van een ObjectId-structuur. Mongo verwerkt de conversie vanstring
naarObjectId
.
De
BookName
eigenschap wordt geannoteerd met het[BsonElement]
kenmerk. De waarde van het kenmerkName
vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.
Een configuratiemodel toevoegen
Voeg de volgende databaseconfiguratiewaarden toe aan
appsettings.json
:{ "BookstoreDatabaseSettings": { "BooksCollectionName": "Books", "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookstoreDb" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } }
Voeg een
BookstoreDatabaseSettings.cs
bestand toe aan de map Modellen met de volgende code: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; } } }
De voorgaande
BookstoreDatabaseSettings
klasse wordt gebruikt om de eigenschapswaarden vanappsettings.json
hetBookstoreDatabaseSettings
bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.Voeg de volgende gemarkeerde code toe aan
Startup.ConfigureServices
: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(); }
In de voorgaande code:
- Het configuratie-exemplaar waaraan de sectie
appsettings.json
van hetBookstoreDatabaseSettings
bestand is gekoppeld, wordt geregistreerd in de Dependency Injection (DI) container. EenBookstoreDatabaseSettings
object'sConnectionString
eigenschap wordt bijvoorbeeld gevuld met deBookstoreDatabaseSettings:ConnectionString
eigenschap inappsettings.json
. - De
IBookstoreDatabaseSettings
interface is geregistreerd in DI als een singleton met een levensduur van de service. Wanneer deze wordt geïnjecteerd, wordt het interface-exemplaar omgezet in eenBookstoreDatabaseSettings
object.
- Het configuratie-exemplaar waaraan de sectie
Voeg de volgende code toe bovenaan
Startup.cs
om deBookstoreDatabaseSettings
enIBookstoreDatabaseSettings
verwijzingen op te lossen:using BooksApi.Models;
Een CRUD-bewerkingsservice toevoegen
Voeg een Services-directory toe aan de hoofdmap van het project.
Voeg een
BookService
klasse toe aan de Services directory met de volgende code: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); } }
In de voorgaande code wordt een
IBookstoreDatabaseSettings
exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot deappsettings.json
configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .Voeg de volgende gemarkeerde code toe aan
Startup.ConfigureServices
: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(); }
In de voorgaande code wordt de
BookService
klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdatBookService
een directe afhankelijkheid vanMongoClient
heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moetMongoClient
worden geregistreerd in DI met een levensduur als een singleton-service.Voeg de volgende code toe bovenaan
Startup.cs
om deBookService
verwijzing op te lossen:using BooksApi.Services;
De BookService
klasse gebruikt de volgende MongoDB.Driver
leden om CRUD-bewerkingen uit te voeren op de database:
MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:
public BookService(IBookstoreDatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); _books = database.GetCollection<Book>(settings.BooksCollectionName); }
IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de
GetCollection<TDocument>(collection)
methode-aanroep:-
collection
vertegenwoordigt de naam van de verzameling. -
TDocument
vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.
-
GetCollection<TDocument>(collection)
retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:
- DeleteOne: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
- Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
- InsertOne: Voegt het opgegeven object in als een nieuw document in de verzameling.
- ReplaceOne: Vervangt het enkele document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.
Een controller toevoegen
Voeg een BooksController
klasse toe aan de map Controllers met de volgende code:
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();
}
}
}
De voorgaande web-API-controller:
- Gebruikt de
BookService
klasse om CRUD-bewerkingen uit te voeren. - Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
- Roept CreatedAtRoute de
Create
actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt.CreatedAtRoute
voegt ook eenLocation
header toe aan het antwoord. DeLocation
header geeft de URI van het zojuist gemaakte boek op.
De web-API testen
Bouw en voer de app uit.
Navigeer naar
https://localhost:<port>/api/books
de parameterlozeGet
actiemethode van de controller te testen. Het volgende JSON-antwoord wordt weergegeven:[ { "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" } ]
Navigeer naar
https://localhost:<port>/api/books/{id here}
om de overbelasteGet
actiemethode van de controller te testen. Het volgende JSON-antwoord wordt weergegeven:{ "id":"{ID}", "bookName":"Clean Code", "price":43.15, "category":"Computers", "author":"Robert C. Martin" }
Opties voor JSON-serialisatie configureren
Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:
- De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
- De
bookName
eigenschap moet worden geretourneerd alsName
.
Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:
Json.NET is verwijderd uit ASP.NET gedeeld framework. Voeg een pakketreferentie toe aan
Microsoft.AspNetCore.Mvc.NewtonsoftJson
.In
Startup.ConfigureServices
, schakel de volgende gemarkeerde code aan deAddControllers
methodeaanroep: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()); }
Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De
Book
eigenschap van deAuthor
klasse serialiseert bijvoorbeeld alsAuthor
.Annotaeer
Models/Book.cs
deBookName
eigenschap met het volgende[JsonProperty]
kenmerk:[BsonElement("Name")] [JsonProperty("Name")] public string BookName { get; set; }
De waarde van het
[JsonProperty]
kenmerkName
vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.Voeg de volgende code toe bovenaan
Models/Book.cs
om de[JsonProperty]
kenmerkreferentie op te lossen:using Newtonsoft.Json;
Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.
Verificatieondersteuning toevoegen aan een web-API
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende IdentityServer. Duende IdentityServer is een product van derden.
Duende IdentityServer is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende IdentityServer maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Zie Overzicht van Duende IdentityServervoor meer informatie.
Raadpleeg Community OSS-verificatieopties voor ASP.NET Core voor meer informatie over andere authenticatieproviders.
Volgende stappen
Zie de volgende bronnen voor meer informatie over het bouwen van ASP.NET Core-web-API's: