Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Warning
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Von Tim Deschryver
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Prerequisites
Die neueste Version von Visual Studio mit der Arbeitslast ASP.NET und Webentwicklung .
Konfigurieren von MongoDB
Aktivieren Sie den Zugriff von MongoDB und MongoDB Shell von überall auf dem Entwicklungscomputer (Windows/Linux/macOS):
MongoDB Shell herunterladen und installieren:
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
mongoshzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB Shell (mongosh.exe) wird bei C:\Users\{USER NAME}\AppData\Local\Programs\mongosh installiert. Fügen Sie den resultierenden Pfad für
mongosh.exezur UmgebungsvariablenPATHhinzu.
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
MongoDB herunterladen und installieren:
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
mongodbzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB wird standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie der Umgebungsvariable
PATHhinzu.
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
Wählen Sie ein Datenspeicherverzeichnis aus: Wählen Sie ein Verzeichnis auf Ihrem Entwicklungscomputer zum Speichern von Daten aus. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die MongoDB Shell erstellt keine neuen Verzeichnisse:
- macOS/Linux: Zum Beispiel
/usr/local/var/mongodb. - Windows: Zum Beispiel
C:\\BooksData.
- macOS/Linux: Zum Beispiel
Verwenden Sie in der Befehlsshell des Betriebssystems (nicht in der MongoDB-Shell) den folgenden Befehl, um eine Verbindung mit MongoDB am Standardport 27017 herzustellen. Ersetzen Sie
{DATA DIRECTORY PATH}durch das im vorherigen Schritt ausgewählte Verzeichnis.mongod --dbpath {DATA DIRECTORY PATH}
Verwenden Sie die zuvor installierte MongoDB-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu MongoDB-Shell-Befehlen finden Sie unter mongosh.
Öffnen Sie eine MongoDB-Befehlsshellinstanz, indem Sie starten
mongosh.exeoder den folgenden Befehl in der Befehlsshell ausführen:mongoshStellen Sie in der Befehlsshell eine Verbindung mit der Standardtestdatenbank her, indem Sie Folgendes ausführen:
use BookStoreWenn nicht bereits vorhanden, wird eine Datenbank namens BookStore erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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" }])Das Ergebnis sieht in etwa wie folgt aus:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }Note
Die im vorherigen Ergebnis angezeigten
ObjectIds stimmen nicht mit denen überein, die in der Befehlsshell angezeigt werden.Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find().pretty()Das Ergebnis sieht in etwa wie folgt aus:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Erstellen eines ASP.NET Core-Web-API-Projektes
- Wechseln Sie zu Datei>Neu>Projekt.
- Wählen Sie den Projekttyp ASP.NET Core-Web-API aus, und klicken Sie auf Weiter.
- Geben Sie dem Projekt den Namen BookStoreApi, und klicken Sie auf Weiter.
- Im Dialogfeld Zusätzliche Informationen:
- Bestätigen Sie, dass Framework.NET 10.0 (Long Term Support) ist.
- Vergewissern Sie sich, dass das Kontrollkästchen für "Controller verwenden " deaktiviert ist.
- Stellen Sie sicher, dass das Kontrollkästchen für OpenAPI-Unterstützung aktivieren aktiviert ist.
- Wählen Sie "Erstellen" aus.
Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }Fügen Sie eine
BookStoreDatabaseSettings-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }Mit der vorhergehenden Klasse
BookStoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookStoreDatabasegespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));Im vorstehenden Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden wird, im Container für die Abhängigkeitsinjektion (DI) registriert. Beispielsweise wird die EigenschaftBookStoreDatabaseSettingsdesConnectionString-Objekts mit der EigenschaftBookStoreDatabase:ConnectionStringinappsettings.jsonaufgefüllt.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBookStoreDatabaseSettingsaufzulösen:using BookStoreApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BooksService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu:using BookStoreApi.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace BookStoreApi.Services; public class BooksService(IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { private readonly IMongoCollection<Book> _booksCollection = new MongoClient(bookStoreDatabaseSettings.Value.ConnectionString) .GetDatabase(bookStoreDatabaseSettings.Value.DatabaseName) .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); }Im vorhergehenden Code wird eine
BookStoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();Im vorhergehenden Code wird die Klasse
BooksServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBooksServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBooksServiceaufzulösen:using BookStoreApi.Services;
Die BooksService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Der Konstruktor dieser Klasse wird in der MongoDB-Verbindungszeichenfolge bereitgestellt:
public class BooksService(IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { private readonly IMongoCollection<Book> _booksCollection = new MongoClient(bookStoreDatabaseSettings.Value.ConnectionString) .GetDatabase(bookStoreDatabaseSettings.Value.DatabaseName) .GetCollection<Book>(bookStoreDatabaseSettings.Value.BooksCollectionName);IMongoDatabase: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOneAsync: Löscht ein einzelnes Dokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOneAsync: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOneAsync: Ersetzt das einzelne Dokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Erstellen von Endpunkten
Ersetzen Sie in der Datei Program.cs das weatherforecast-Beispiel durch die folgenden Endpunkte für Bücher:
var booksGroup = app.MapGroup("/books");
booksGroup.MapGet("/", async (BooksService booksService) =>
{
var books = await booksService.GetAsync();
return Results.Ok(books);
});
booksGroup.MapGet("/{id:length(24)}", async (string id, BooksService booksService) =>
{
var book = await booksService.GetAsync(id);
return book is null ? Results.NotFound() : Results.Ok(book);
});
booksGroup.MapPost("/", async (Book newBook, BooksService booksService) =>
{
await booksService.CreateAsync(newBook);
return Results.Created($"/books/{newBook.Id}", newBook);
});
booksGroup.MapPut("/{id:length(24)}", async (string id, Book updatedBook, BooksService booksService) =>
{
var book = await booksService.GetAsync(id);
if (book is null)
{
return Results.NotFound();
}
updatedBook.Id = book.Id;
await booksService.UpdateAsync(id, updatedBook);
return Results.NoContent();
});
booksGroup.MapDelete("/{id:length(24)}", async (string id, BooksService booksService) =>
{
var book = await booksService.GetAsync(id);
if (book is null)
{
return Results.NotFound();
}
await booksService.RemoveAsync(id);
return Results.NoContent();
});
Der vorherige Code:
- Verwendet MapGroup, um alle buchbezogenen Endpunkte zu organisieren, und stellt für alle Endpunkte in der Gruppe das gemeinsame Routenpräfix
/booksbereit. - Enthält Endpunkte zur Unterstützung von GET-, POST-, PUT- und DELETE-HTTP-Anforderungen.
- Verwendet die
BooksService-Klasse, um CRUD-Vorgänge auszuführen. - Ruft Created in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.Createdfügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
Fügen Sie in
Program.csden folgenden hervorgehobenen Code hinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>(); builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => { options.SerializerOptions.PropertyNamingPolicy = null; });Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorund nicht alsauthorserialisiert.Kommentieren Sie in
Models/Book.csdieBookName-Eigenschaft mit dem[JsonPropertyName]-Attribut:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;Der Wert
[JsonPropertyName]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonPropertyName]-Attribut aufzulösen:using System.Text.Json.Serialization;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Testen der Web-API
In diesem Tutorial werden der Endpoints Explorer und .http-Dateien verwendet, um die API zu testen.
Erstellen Sie die App, und führen Sie sie aus.
Klicken Sie im Endpunkt-Explorer mit der rechten Maustaste auf den ersten GET-Endpunkt
/books, und wählen Sie "Anforderung generieren" aus.Der folgende Inhalt wird der
BookStoreApi.httpDatei hinzugefügt. Wenn dies das erste Mal ist, dass eine Anforderung generiert wird, wird die Datei im Projektstamm erstellt.@BookStoreApi_HostAddress = https://localhost:{PORT} GET {{BookStoreApi_HostAddress}}/books ###Die Portnummer sollte bereits auf den von der App verwendeten Port festgelegt werden,
https://localhost:56874z. B. . Wenn dies nicht der Fall ist, können Sie beim Starten der App Ihre Portnummer im Ausgabefenster finden.Wählen Sie den Link " Anfrage senden" oberhalb der neuen
GETAnforderungszeile aus.Die GET-Anforderung wird an die App gesendet, und die Antwort wird im Bereich Antwort angezeigt.
Der Antworttext zeigt das JSON-Ergebnis mit den Bucheinträgen an, ähnlich wie das folgende:
[ { "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" } ]Um ein einzelnes Buch abzurufen, klicken Sie mit der rechten Maustaste auf den
/books/{id}, params (string id)GET-Endpunkt im Endpunkt-Explorer, und wählen Sie " Anforderung generieren" aus.Der folgende Inhalt wird an die
BookStoreApi.httpDatei angefügt:@id=string GET {{BookStoreApi_HostAddress}}/books/{{id}} ###Ersetzen Sie
iddie Variable durch eine der IDs, die von der früheren Anforderung zurückgegeben werden, z. B.:@id="61a6058e6c43f32854e51f52" GET {{BookStoreApi_HostAddress}}/books/{{id}} ###Wählen Sie den Link " Anfrage senden" oberhalb der neuen
GETAnforderungszeile aus.Die GET-Anforderung wird an die App gesendet, und die Antwort wird im Bereich Antwort angezeigt.
Der Antworttext ähnelt der folgenden JSON-Struktur:
{ "Id": "61a6058e6c43f32854e51f52", "Name": "Clean Code", "Price": 43.15, "Category": "Computers", "Author": "Robert C. Martin" }Um den POST-Endpunkt zu testen, klicken Sie mit der rechten Maustaste auf den
/booksPOST-Endpunkt , und wählen Sie "Anforderung generieren" aus.Der folgende Inhalt wird der Datei
BookStoreApi.httphinzugefügt:POST {{BookStoreApi_HostAddress}}/books Content-Type: application/json { //Book } ###Ersetzen Sie den Book-Kommentar durch ein Buchobjekt als JSON-Anforderungstext:
POST {{BookStoreApi_HostAddress}}/books Content-Type: application/json { "Name": "The Pragmatic Programmer", "Price": 49.99, "Category": "Computers", "Author": "Andy Hunt" } ###Wählen Sie den Link " Anfrage senden" oberhalb der Anforderungszeile
POSTaus.Die POST-Anforderung wird an die App gesendet, und die Antwort wird im Antwortbereich angezeigt. Die Antwort sollte das neu erstellte Buch mit der zugewiesenen ID enthalten.
Zum Löschen eines Buchs klicken Sie mit der rechten Maustaste auf den
/books/{id}, params (string id)DELETE-Endpunkt , und wählen Sie " Anforderung generieren" aus.Der folgende Inhalt wird an die
BookStoreApi.httpDatei angefügt:DELETE {{BookStoreApi_HostAddress}}/books/{{id}} ###Ersetzen Sie die
idVariable durch eine der IDs, die von der früheren Anforderung zurückgegeben werden, und klicken Sie auf " Anforderung senden". Beispiel:DELETE {{BookStoreApi_HostAddress}}/books/67f417517ce1b36aeab71236 ###
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Verwenden Sie zum Sichern von Web-APIs und SPAs eine der folgenden Optionen:
Duende Identity Server ist ein OpenID Connect- und OAuth 2.0-Framework für ASP.NET Core. Duende Identity Server ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Important
Duende Software erhebt ggf. eine Lizenzgebühr für die Nutzung von Duende Identity Server in der Produktion.
Weitere Informationen finden Sie in der Dokumentation zu Duende Identity Server (Website von Duende Software).
Verwandte Inhalte
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Prerequisites
Visual Studio 2022 mit der Workload ASP.NET und Webentwicklung
Konfigurieren von MongoDB
Aktivieren Sie den Zugriff von MongoDB und MongoDB Shell von überall auf dem Entwicklungscomputer (Windows/Linux/macOS):
MongoDB Shell herunterladen und installieren:
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
mongoshzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB Shell (mongosh.exe) wird unter C:\Users\user<\>AppData\Local\Programs\mongosh installiert. Fügen Sie den resultierenden Pfad für
mongosh.exezur UmgebungsvariablenPATHhinzu.
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
MongoDB herunterladen und installieren:
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
mongodbzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB wird standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie C:\Program Files\MongoDB\Server\<version_number>\bin der Umgebungsvariablen
PATHhinzu.
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
Wählen Sie ein Datenspeicherverzeichnis aus: Wählen Sie ein Verzeichnis auf Ihrem Entwicklungscomputer zum Speichern von Daten aus. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die MongoDB Shell erstellt keine neuen Verzeichnisse:
- macOS/Linux: Zum Beispiel
/usr/local/var/mongodb. - Windows: Zum Beispiel
C:\\BooksData.
- macOS/Linux: Zum Beispiel
Verwenden Sie in der Befehlsshell des Betriebssystems (nicht in der MongoDB-Shell) den folgenden Befehl, um eine Verbindung mit MongoDB am Standardport 27017 herzustellen. Ersetzen Sie
<data_directory_path>durch das im vorherigen Schritt ausgewählte Verzeichnis.mongod --dbpath <data_directory_path>
Verwenden Sie die zuvor installierte MongoDB-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu MongoDB-Shell-Befehlen finden Sie unter mongosh.
Öffnen Sie eine MongoDB-Befehlsshellinstanz, indem Sie starten
mongosh.exeoder den folgenden Befehl in der Befehlsshell ausführen:mongoshStellen Sie in der Befehlsshell eine Verbindung mit der Standardtestdatenbank her, indem Sie Folgendes ausführen:
use BookStoreWenn nicht bereits vorhanden, wird eine Datenbank namens BookStore erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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" }])Das Ergebnis sieht in etwa wie folgt aus:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }Note
Die im vorherigen Ergebnis angezeigten
ObjectIds stimmen nicht mit denen überein, die in der Befehlsshell angezeigt werden.Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find().pretty()Das Ergebnis sieht in etwa wie folgt aus:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Erstellen eines ASP.NET Core-Web-API-Projektes
- Wechseln Sie zu Datei>Neu>Projekt.
- Wählen Sie den Projekttyp ASP.NET Core-Web-API aus, und klicken Sie auf Weiter.
- Geben Sie dem Projekt den Namen BookStoreApi, und klicken Sie auf Weiter.
- Im Dialogfeld Zusätzliche Informationen:
- Vergewissern Sie sich, dass das Framework auf .NET 9.0 (Standard-Support) festgelegt ist.
- Vergewissern Sie sich, dass das Kontrollkästchen für "Controller verwenden" aktiviert ist.
- Stellen Sie sicher, dass das Kontrollkästchen für OpenAPI-Unterstützung aktivieren aktiviert ist.
- Wählen Sie "Erstellen" aus.
Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }Fügen Sie eine
BookStoreDatabaseSettings-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }Mit der vorhergehenden Klasse
BookStoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookStoreDatabasegespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));Im vorstehenden Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden wird, im Container für die Abhängigkeitsinjektion (DI) registriert. Beispielsweise wird die EigenschaftBookStoreDatabaseSettingsdesConnectionString-Objekts mit der EigenschaftBookStoreDatabase:ConnectionStringinappsettings.jsonaufgefüllt.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBookStoreDatabaseSettingsaufzulösen:using BookStoreApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BooksService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu: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); }Im vorhergehenden Code wird eine
BookStoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();Im vorhergehenden Code wird die Klasse
BooksServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBooksServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBooksServiceaufzulösen:using BookStoreApi.Services;
Die BooksService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Der Konstruktor dieser Klasse wird in der MongoDB-Verbindungszeichenfolge bereitgestellt:
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: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOneAsync: Löscht ein einzelnes Dokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOneAsync: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOneAsync: Ersetzt das einzelne Dokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Hinzufügen eines Controllers
Fügen Sie eine BooksController-Klasse zum Verzeichnis Controller mit dem folgenden Code hinzu:
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();
}
}
Der oben aufgeführte Web-API-Controller:
- Verwendet die
BooksService-Klasse, um CRUD-Vorgänge auszuführen. - Enthält Aktionsmethoden zur Unterstützung von GET-, POST-, PUT- und DELETE HTTP-Anforderungen.
- Ruft CreatedAtAction in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.CreatedAtActionfügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
Verketten Sie in
Program.csden folgenden hervorgehobenen Code mit dem Aufruf derAddControllers-Methode: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);Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorund nicht alsauthorserialisiert.Kommentieren Sie in
Models/Book.csdieBookName-Eigenschaft mit dem[JsonPropertyName]-Attribut:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;Der Wert
[JsonPropertyName]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonPropertyName]-Attribut aufzulösen:using System.Text.Json.Serialization;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Testen der Web-API
In diesem Tutorial werden der Endpoints Explorer und .http-Dateien verwendet, um die API zu testen.
Erstellen Sie die App, und führen Sie sie aus.
Klicken Sie im Endpunkt-Explorer mit der rechten Maustaste auf den ersten GET-Endpunkt
/api/books, und wählen Sie "Anforderung generieren" aus.Der folgende Inhalt wird der
BookStoreApi.httpDatei hinzugefügt. Wenn dies das erste Mal ist, dass eine Anforderung generiert wird, wird die Datei im Projektstamm erstellt.@BookStoreApi_HostAddress = https://localhost:<port> GET {{BookStoreApi_HostAddress}}/api/books ###Die Portnummer sollte bereits auf den von der App verwendeten Port festgelegt werden,
https://localhost:56874z. B. . Wenn dies nicht der Fall ist, können Sie beim Starten der App Ihre Portnummer im Ausgabefenster finden.Wählen Sie den Link " Anfrage senden" oberhalb der neuen
GETAnforderungszeile aus.Die GET-Anforderung wird an die App gesendet, und die Antwort wird im Bereich Antwort angezeigt.
Der Antworttext zeigt das JSON-Ergebnis mit den Bucheinträgen an, ähnlich wie das folgende:
[ { "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" } ]Um ein einzelnes Buch abzurufen, klicken Sie mit der rechten Maustaste auf den
/api/books/{id}, params (string id)GET-Endpunkt im Endpunkt-Explorer, und wählen Sie " Anforderung generieren" aus.Der folgende Inhalt wird an die
BookStoreApi.httpDatei angefügt:@id=string GET {{BookStoreApi_HostAddress}}/api/books/{{id}} ###Ersetzen Sie
iddie Variable durch eine der IDs, die von der früheren Anforderung zurückgegeben werden, z. B.:@id="61a6058e6c43f32854e51f52" GET {{BookStoreApi_HostAddress}}/api/books/{{id}} ###Wählen Sie den Link " Anfrage senden" oberhalb der neuen
GETAnforderungszeile aus.Die GET-Anforderung wird an die App gesendet, und die Antwort wird im Bereich Antwort angezeigt.
Der Antworttext ähnelt der folgenden JSON-Struktur:
{ "Id": "61a6058e6c43f32854e51f52", "Name": "Clean Code", "Price": 43.15, "Category": "Computers", "Author": "Robert C. Martin" }Um den POST-Endpunkt zu testen, klicken Sie mit der rechten Maustaste auf den
/api/booksPOST-Endpunkt , und wählen Sie "Anforderung generieren" aus.Der folgende Inhalt wird der Datei
BookStoreApi.httphinzugefügt:POST {{BookStoreApi_HostAddress}}/api/books Content-Type: application/json { //Book } ###Ersetzen Sie den Book-Kommentar durch ein Buchobjekt als JSON-Anforderungstext:
POST {{BookStoreApi_HostAddress}}/api/books Content-Type: application/json { "Name": "The Pragmatic Programmer", "Price": 49.99, "Category": "Computers", "Author": "Andy Hunt" } ###Wählen Sie den Link " Anfrage senden" oberhalb der Anforderungszeile
POSTaus.Die POST-Anforderung wird an die App gesendet, und die Antwort wird im Antwortbereich angezeigt. Die Antwort sollte das neu erstellte Buch mit der zugewiesenen ID enthalten.
Zum Löschen eines Buchs klicken Sie mit der rechten Maustaste auf den
/api/books/{id}, params (string id)DELETE-Endpunkt , und wählen Sie " Anforderung generieren" aus.Der folgende Inhalt wird an die
BookStoreApi.httpDatei angefügt:DELETE {{BookStoreApi_HostAddress}}/api/Books/{{id}} ###Ersetzen Sie die
idVariable durch eine der IDs, die von der früheren Anforderung zurückgegeben werden, und klicken Sie auf " Anforderung senden". Beispiel:DELETE {{BookStoreApi_HostAddress}}/api/Books/67f417517ce1b36aeab71236 ###
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Um Web-APIs und SPAs zu sichern, sollten Sie eine der folgenden Optionen berücksichtigen:
- Microsoft Entra-ID
- OpenIddict
- Duende IdentityServer
- Andere communitygestützte Authentifizierungslösungen
Einen Vergleich von Identitätslösungen finden Sie unter Identity Verwaltungslösungen für .NET-Web-Apps.
Duende IdentityServer ist ein OpenID Connect und OAuth 2.0 Framework für ASP.NET Core. Duende IdentityServer ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Important
Duende Software erfordert möglicherweise, dass Sie eine Lizenzgebühr für die Produktionsnutzung von Duende IdentityServer bezahlen. Weitere Informationen finden Sie unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Duende IdentityServer-Dokumentation (Duende Software-Website).
Verwandte Inhalte
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Prerequisites
Visual Studio 2022 mit der Workload ASP.NET und Webentwicklung
Konfigurieren von MongoDB
Aktivieren Sie den Zugriff von MongoDB und MongoDB Shell von überall auf dem Entwicklungscomputer (Windows/Linux/macOS):
MongoDB Shell herunterladen und installieren:
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
mongoshzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB Shell (mongosh.exe) wird unter C:\Users\user<\>AppData\Local\Programs\mongosh installiert. Fügen Sie den resultierenden Pfad für
mongosh.exezur UmgebungsvariablenPATHhinzu.
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie den resultierenden Pfad für
MongoDB herunterladen und installieren:
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
mongodbzur UmgebungsvariablenPATHhinzu. - Windows: MongoDB wird standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie C:\Program Files\MongoDB\Server\<version_number>\bin der Umgebungsvariablen
PATHhinzu.
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie den resultierenden Pfad für
Wählen Sie ein Datenspeicherverzeichnis aus: Wählen Sie ein Verzeichnis auf Ihrem Entwicklungscomputer zum Speichern von Daten aus. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die MongoDB Shell erstellt keine neuen Verzeichnisse:
- macOS/Linux: Zum Beispiel
/usr/local/var/mongodb. - Windows: Zum Beispiel
C:\\BooksData.
- macOS/Linux: Zum Beispiel
Verwenden Sie in der Befehlsshell des Betriebssystems (nicht in der MongoDB-Shell) den folgenden Befehl, um eine Verbindung mit MongoDB am Standardport 27017 herzustellen. Ersetzen Sie
<data_directory_path>durch das im vorherigen Schritt ausgewählte Verzeichnis.mongod --dbpath <data_directory_path>
Verwenden Sie die zuvor installierte MongoDB-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu MongoDB-Shell-Befehlen finden Sie unter mongosh.
Öffnen Sie eine MongoDB-Befehlsshellinstanz, indem Sie starten
mongosh.exeoder den folgenden Befehl in der Befehlsshell ausführen:mongoshStellen Sie in der Befehlsshell eine Verbindung mit der Standardtestdatenbank her, indem Sie Folgendes ausführen:
use BookStoreWenn nicht bereits vorhanden, wird eine Datenbank namens BookStore erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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" }])Das Ergebnis sieht in etwa wie folgt aus:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }Note
Die im vorherigen Ergebnis angezeigten
ObjectIds stimmen nicht mit denen überein, die in der Befehlsshell angezeigt werden.Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find().pretty()Das Ergebnis sieht in etwa wie folgt aus:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Erstellen eines ASP.NET Core-Web-API-Projektes
Wechseln Sie zu Datei>Neu>Projekt.
Wählen Sie den Projekttyp ASP.NET Core-Web-API aus, und klicken Sie auf Weiter.
Geben Sie dem Projekt den Namen BookStoreApi, und klicken Sie auf Weiter.
Wählen Sie das Framework .NET 8.0 (langfristiger Support) und dann Erstellen aus.
Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }Fügen Sie eine
BookStoreDatabaseSettings-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }Mit der vorhergehenden Klasse
BookStoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookStoreDatabasegespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));Im vorstehenden Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden wird, im Container für die Abhängigkeitsinjektion (DI) registriert. Beispielsweise wird die EigenschaftBookStoreDatabaseSettingsdesConnectionString-Objekts mit der EigenschaftBookStoreDatabase:ConnectionStringinappsettings.jsonaufgefüllt.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBookStoreDatabaseSettingsaufzulösen:using BookStoreApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BooksService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu: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); }Im vorhergehenden Code wird eine
BookStoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();Im vorhergehenden Code wird die Klasse
BooksServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBooksServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBooksServiceaufzulösen:using BookStoreApi.Services;
Die BooksService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Der Konstruktor dieser Klasse wird in der MongoDB-Verbindungszeichenfolge bereitgestellt:
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: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOneAsync: Löscht ein einzelnes Dokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOneAsync: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOneAsync: Ersetzt das einzelne Dokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Hinzufügen eines Controllers
Fügen Sie eine BooksController-Klasse zum Verzeichnis Controller mit dem folgenden Code hinzu:
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();
}
}
Der oben aufgeführte Web-API-Controller:
- Verwendet die
BooksService-Klasse, um CRUD-Vorgänge auszuführen. - Enthält Aktionsmethoden zur Unterstützung von GET-, POST-, PUT- und DELETE HTTP-Anforderungen.
- Ruft CreatedAtAction in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.CreatedAtActionfügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Testen der Web-API
Erstellen Sie die App, und führen Sie sie aus.
Navigieren Sie zu
https://localhost:<port>/api/books, wobei<port>für die automatisch zugewiesene Portnummer für die App steht, um die parameterloseGet-Aktionsmethode des Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:[ { "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" } ]Wechseln Sie zu
https://localhost:<port>/api/books/{id here}, um die überladene AktionsmethodeGetdes Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
Verketten Sie in
Program.csden folgenden hervorgehobenen Code mit dem Aufruf derAddControllers-Methode: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);Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorund nicht alsauthorserialisiert.Kommentieren Sie in
Models/Book.csdieBookName-Eigenschaft mit dem[JsonPropertyName]-Attribut:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;Der Wert
[JsonPropertyName]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonProperty]-Attribut aufzulösen:using System.Text.Json.Serialization;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Um Web-APIs und SPAs zu sichern, sollten Sie eine der folgenden Optionen berücksichtigen:
- Microsoft Entra-ID
- OpenIddict
- Duende IdentityServer
- Andere communitygestützte Authentifizierungslösungen
Einen Vergleich von Identitätslösungen finden Sie unter Identity Verwaltungslösungen für .NET-Web-Apps.
Duende IdentityServer ist ein OpenID Connect und OAuth 2.0 Framework für ASP.NET Core. Duende IdentityServer ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Important
Duende Software erfordert möglicherweise, dass Sie eine Lizenzgebühr für die Produktionsnutzung von Duende IdentityServer bezahlen. Weitere Informationen finden Sie unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Duende IdentityServer-Dokumentation (Duende Software-Website).
Verwandte Inhalte
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Prerequisites
Visual Studio 2022 mit der Workload ASP.NET und Webentwicklung
Konfigurieren von MongoDB
Ermöglichen Sie den Zugriff auf MongoDB und die Mongo DB-Shell überall auf dem Entwicklungscomputer:
Unter Windows wird MongoDB standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie C:\Program Files\MongoDB\Server\<version_number>\bin der Umgebungsvariablen
PATHhinzu.Laden Sie die MongoDB-Shell herunter, und wählen Sie ein Verzeichnis aus, in das sie extrahiert werden soll. Fügen Sie den resultierenden Pfad für
mongosh.exezur UmgebungsvariablenPATHhinzu.Wählen Sie auf dem Entwicklungscomputer ein Verzeichnis zum Speichern der Daten aus. Zum Beispiel C:\BooksData auf Windows. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die Mongo-Shell erstellt keine neuen Verzeichnisse.
Verwenden Sie in der Befehlsshell des Betriebssystems (nicht in der MongoDB-Shell) den folgenden Befehl, um eine Verbindung mit MongoDB am Standardport 27017 herzustellen. Ersetzen Sie
<data_directory_path>durch das im vorherigen Schritt ausgewählte Verzeichnis.mongod --dbpath <data_directory_path>
Verwenden Sie die zuvor installierte MongoDB-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu MongoDB-Shell-Befehlen finden Sie unter mongosh.
Öffnen Sie eine MongoDB-Befehlsshellinstanz, indem Sie starten
mongosh.exeoder den folgenden Befehl in der Befehlsshell ausführen:mongoshStellen Sie in der Befehlsshell eine Verbindung mit der Standardtestdatenbank her, indem Sie Folgendes ausführen:
use BookStoreWenn nicht bereits vorhanden, wird eine Datenbank namens BookStore erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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" }])Das Ergebnis sieht in etwa wie folgt aus:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }Note
Die im vorherigen Ergebnis angezeigten
ObjectIds stimmen nicht mit denen überein, die in der Befehlsshell angezeigt werden.Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find().pretty()Das Ergebnis sieht in etwa wie folgt aus:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Erstellen eines ASP.NET Core-Web-API-Projektes
Wechseln Sie zu Datei>Neu>Projekt.
Wählen Sie den Projekttyp ASP.NET Core-Web-API aus, und klicken Sie auf Weiter.
Geben Sie dem Projekt den Namen BookStoreApi, und klicken Sie auf Weiter.
Wählen Sie das Framework .NET 7.0 (Standard-Support) aus, und wählen Sie dann Erstellen aus.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }Fügen Sie eine
BookStoreDatabaseSettings-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }Mit der vorhergehenden Klasse
BookStoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookStoreDatabasegespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));Im vorstehenden Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden wird, im Container für die Abhängigkeitsinjektion (DI) registriert. Beispielsweise wird die EigenschaftBookStoreDatabaseSettingsdesConnectionString-Objekts mit der EigenschaftBookStoreDatabase:ConnectionStringinappsettings.jsonaufgefüllt.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBookStoreDatabaseSettingsaufzulösen:using BookStoreApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BooksService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu: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); }Im vorhergehenden Code wird eine
BookStoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();Im vorhergehenden Code wird die Klasse
BooksServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBooksServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBooksServiceaufzulösen:using BookStoreApi.Services;
Die BooksService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Dem Konstruktor dieser Klasse wird die MongoDB-Verbindungszeichenfolge übergeben:
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: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOneAsync: Löscht ein einzelnes Dokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOneAsync: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOneAsync: Ersetzt das einzelne Dokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Hinzufügen eines Controllers
Fügen Sie eine BooksController-Klasse zum Verzeichnis Controller mit dem folgenden Code hinzu:
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();
}
}
Der oben aufgeführte Web-API-Controller:
- Verwendet die
BooksService-Klasse, um CRUD-Vorgänge auszuführen. - Enthält Aktionsmethoden zur Unterstützung von GET-, POST-, PUT- und DELETE HTTP-Anforderungen.
- Ruft CreatedAtAction in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.CreatedAtActionfügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Testen der Web-API
Erstellen Sie die App, und führen Sie sie aus.
Navigieren Sie zu
https://localhost:<port>/api/books, wobei<port>für die automatisch zugewiesene Portnummer für die App steht, um die parameterloseGet-Aktionsmethode des Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:[ { "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" } ]Wechseln Sie zu
https://localhost:<port>/api/books/{id here}, um die überladene AktionsmethodeGetdes Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
Verketten Sie in
Program.csden folgenden hervorgehobenen Code mit dem Aufruf derAddControllers-Methode: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);Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorund nicht alsauthorserialisiert.Kommentieren Sie in
Models/Book.csdieBookName-Eigenschaft mit dem[JsonPropertyName]-Attribut:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;Der Wert
[JsonPropertyName]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonProperty]-Attribut aufzulösen:using System.Text.Json.Serialization;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Um Web-APIs und SPAs zu sichern, sollten Sie eine der folgenden Optionen berücksichtigen:
- Microsoft Entra-ID
- OpenIddict
- Duende IdentityServer
- Andere communitygestützte Authentifizierungslösungen
Einen Vergleich von Identitätslösungen finden Sie unter Identity Verwaltungslösungen für .NET-Web-Apps.
Duende IdentityServer ist ein OpenID Connect und OAuth 2.0 Framework für ASP.NET Core. Duende IdentityServer ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Important
Duende Software erfordert möglicherweise, dass Sie eine Lizenzgebühr für die Produktionsnutzung von Duende IdentityServer bezahlen. Weitere Informationen finden Sie unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Duende IdentityServer-Dokumentation (Duende Software-Website).
Verwandte Inhalte
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Prerequisites
- Visual Studio 2022 mit der Workload ASP.NET und Webentwicklung
- .NET 6 SDK
Konfigurieren von MongoDB
Ermöglichen Sie den Zugriff auf MongoDB und die Mongo DB-Shell überall auf dem Entwicklungscomputer:
Unter Windows wird MongoDB standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie C:\Program Files\MongoDB\Server\<version_number>\bin der Umgebungsvariablen
PATHhinzu.Laden Sie die MongoDB-Shell herunter, und wählen Sie ein Verzeichnis aus, in das sie extrahiert werden soll. Fügen Sie den resultierenden Pfad für
mongosh.exezur UmgebungsvariablenPATHhinzu.Wählen Sie auf dem Entwicklungscomputer ein Verzeichnis zum Speichern der Daten aus. Zum Beispiel C:\BooksData auf Windows. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die Mongo-Shell erstellt keine neuen Verzeichnisse.
Verwenden Sie in der Befehlsshell des Betriebssystems (nicht in der MongoDB-Shell) den folgenden Befehl, um eine Verbindung mit MongoDB am Standardport 27017 herzustellen. Ersetzen Sie
<data_directory_path>durch das im vorherigen Schritt ausgewählte Verzeichnis.mongod --dbpath <data_directory_path>
Verwenden Sie die zuvor installierte MongoDB-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu MongoDB-Shell-Befehlen finden Sie unter mongosh.
Öffnen Sie eine MongoDB-Befehlsshellinstanz, indem Sie starten
mongosh.exeoder den folgenden Befehl in der Befehlsshell ausführen:mongoshStellen Sie in der Befehlsshell eine Verbindung mit der Standardtestdatenbank her, indem Sie Folgendes ausführen:
use BookStoreWenn nicht bereits vorhanden, wird eine Datenbank namens BookStore erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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" }])Das Ergebnis sieht in etwa wie folgt aus:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }Note
Die im vorherigen Ergebnis angezeigten
ObjectIds stimmen nicht mit denen überein, die in der Befehlsshell angezeigt werden.Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find().pretty()Das Ergebnis sieht in etwa wie folgt aus:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Erstellen eines ASP.NET Core-Web-API-Projektes
Wechseln Sie zu Datei>Neu>Projekt.
Wählen Sie den Projekttyp ASP.NET Core-Web-API aus, und klicken Sie auf Weiter.
Geben Sie dem Projekt den Namen BookStoreApi, und klicken Sie auf Weiter.
Wählen Sie das Framework .NET 6.0 (langfristiger Support) und dann Erstellen aus.
Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }Fügen Sie eine
BookStoreDatabaseSettings-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }Mit der vorhergehenden Klasse
BookStoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookStoreDatabasegespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));Im vorstehenden Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden wird, im Container für die Abhängigkeitsinjektion (DI) registriert. Beispielsweise wird die EigenschaftBookStoreDatabaseSettingsdesConnectionString-Objekts mit der EigenschaftBookStoreDatabase:ConnectionStringinappsettings.jsonaufgefüllt.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBookStoreDatabaseSettingsaufzulösen:using BookStoreApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BooksService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu: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); }Im vorhergehenden Code wird eine
BookStoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Program.cshinzu:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();Im vorhergehenden Code wird die Klasse
BooksServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBooksServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Program.cshinzu, um den VerweisBooksServiceaufzulösen:using BookStoreApi.Services;
Die BooksService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Dem Konstruktor dieser Klasse wird die MongoDB-Verbindungszeichenfolge übergeben:
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: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOneAsync: Löscht ein einzelnes Dokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOneAsync: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOneAsync: Ersetzt das einzelne Dokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Hinzufügen eines Controllers
Fügen Sie eine BooksController-Klasse zum Verzeichnis Controller mit dem folgenden Code hinzu:
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();
}
}
Der oben aufgeführte Web-API-Controller:
- Verwendet die
BooksService-Klasse, um CRUD-Vorgänge auszuführen. - Enthält Aktionsmethoden zur Unterstützung von GET-, POST-, PUT- und DELETE HTTP-Anforderungen.
- Ruft CreatedAtAction in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.CreatedAtActionfügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Testen der Web-API
Erstellen Sie die App, und führen Sie sie aus.
Navigieren Sie zu
https://localhost:<port>/api/books, wobei<port>für die automatisch zugewiesene Portnummer für die App steht, um die parameterloseGet-Aktionsmethode des Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:[ { "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" } ]Wechseln Sie zu
https://localhost:<port>/api/books/{id here}, um die überladene AktionsmethodeGetdes Controllers zu testen. Eine JSON-Antwort ähnlich der folgenden wird angezeigt:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
Verketten Sie in
Program.csden folgenden hervorgehobenen Code mit dem Aufruf derAddControllers-Methode: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);Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorund nicht alsauthorserialisiert.Kommentieren Sie in
Models/Book.csdieBookName-Eigenschaft mit dem[JsonPropertyName]-Attribut:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;Der Wert
[JsonPropertyName]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonProperty]-Attribut aufzulösen:using System.Text.Json.Serialization;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Um Web-APIs und SPAs zu sichern, sollten Sie eine der folgenden Optionen berücksichtigen:
- Microsoft Entra-ID
- OpenIddict
- Duende IdentityServer
- Andere communitygestützte Authentifizierungslösungen
Einen Vergleich von Identitätslösungen finden Sie unter Identity Verwaltungslösungen für .NET-Web-Apps.
Duende IdentityServer ist ein OpenID Connect und OAuth 2.0 Framework für ASP.NET Core. Duende IdentityServer ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Important
Duende Software erfordert möglicherweise, dass Sie eine Lizenzgebühr für die Produktionsnutzung von Duende IdentityServer bezahlen. Weitere Informationen finden Sie unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Duende IdentityServer-Dokumentation (Duende Software-Website).
Verwandte Inhalte
Dieses Tutorial erstellt eine Web-API, die CRUD-Vorgänge (Create, Read, Update, Delete) für eine MongoDB-NoSQL-Datenbank durchführt.
In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:
- Konfigurieren von MongoDB
- Erstellen einer MongoDB-Datenbank
- Definieren einer MongoDB-Sammlung und eines Schemas
- Ausführen von MongoDB-CRUD-Vorgänge über eine Web-API
- Anpassen der JSON-Serialisierung
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Prerequisites
- .NET Core SDK 3.0 oder höher
- Visual Studio 2019 mit der Workload ASP.NET und Webentwicklung
- MongoDB
Konfigurieren von MongoDB
Wenn Sie Windows verwenden, wird MongoDB standardmäßig unter C:\Program Files\MongoDB installiert. Fügen Sie C:\Program Files\MongoDB\Server\<version_number>\bin der Umgebungsvariablen Path hinzu. Durch diese Änderung können Sie von einer beliebigen Stelle auf Ihrem Entwicklungscomputer auf MongoDB zugreifen.
Verwenden Sie die Mongo-Shell in den folgenden Schritten, um eine Datenbank zu erstellen, Sammlungen durchzuführen und Dokumente zu speichern. Weitere Informationen zu Mongo-Shell-Befehlen finden Sie unter Arbeiten mit der Mongo-Shell.
Wählen Sie ein Verzeichnis auf Ihrem Entwicklungscomputer zum Speichern der Daten. Zum Beispiel C:\BooksData auf Windows. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. Die Mongo-Shell erstellt keine neuen Verzeichnisse.
Öffnen Sie eine Befehlsshell. Führen Sie den folgenden Befehl aus, um eine Verbindung zu MongoDB auf dem Standardport 27017 herzustellen. Denken Sie daran,
<data_directory_path>durch das Verzeichnis zu ersetzen, das Sie im vorherigen Schritt gewählt haben.mongod --dbpath <data_directory_path>Öffnen Sie eine andere Befehlsshellinstanz. Verbinden Sie sich mit der Standardtestdatenbank, indem Sie den folgenden Befehl ausführen:
mongoFühren Sie den folgenden Befehl in einer Befehlsshell aus:
use BookstoreDbWenn nicht bereits vorhanden, wird eine Datenbank namens BookstoreDb erstellt. Wenn die Datenbank vorhanden ist, wird die Verbindung für Transaktionen geöffnet.
Erstellen Sie eine
Books-Sammlung mithilfe des folgenden Befehls:db.createCollection('Books')Das folgende Ergebnis wird angezeigt:
{ "ok" : 1 }Definieren Sie ein Schema für die
Books-Sammlung. und fügen zwei Dokumente mithilfe des folgenden Befehls ein: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'}])Das folgende Ergebnis wird angezeigt:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }Note
Beim Ausführen dieses Beispiels stimmen die in diesem Artikel angezeigten IDs nicht mit den IDs überein.
Zeigen Sie die Dokumente in der Datenbank mithilfe des folgenden Befehls an:
db.Books.find({}).pretty()Das folgende Ergebnis wird angezeigt:
{ "_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" }Das Schema fügt eine automatisch generierte
_idEigenschaft vom TypObjectIdfür jedes Dokument hinzu.
Die Datenbank ist bereit. Sie können beginnen, die ASP.NET Core-Web-API zu erstellen.
Erstellen eines ASP.NET Core-Web-API-Projektes
Wechseln Sie zu Datei>Neu>Projekt.
Wählen Sie den Projekttyp ASP.NET Core-Webanwendung aus, und klicken Sie auf Weiter.
Geben Sie dem Projekt den Namen BooksApi, und klicken Sie auf Erstellen.
Wählen Sie das .NET Core-Zielframework und ASP.NET Core 3.0 aus. Wählen Sie die Projektvorlage API aus, und klicken Sie auf Erstellen.
Besuchen Sie den NuGet-Katalog: MongoDB.Driver, um die neueste stabile Version des .NET-Treibers für MongoDB zu ermitteln. Navigieren Sie im Fenster Paket-Manager-Konsole zum Stammverzeichnis des Projekts. Führen Sie den folgenden Befehl aus, um den .NET-Treiber für MongoDB zu installieren:
Install-Package MongoDB.Driver -Version {VERSION}
Hinzufügen eines Entitätsmodells
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Modelle hinzu.
Fügen Sie eine
Book-Klasse zum Verzeichnis Modelle mit dem folgenden Code hinzu: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 der obigen Klasse gilt für die
Id-Eigenschaft Folgendes:- Sie ist erforderlich, um der MongoDB-Sammlung das CLR-Objekt (Common Language Runtime) zuzuordnen.
- Sie wird mit
[BsonId]kommentiert, um diese Eigenschaft als Primärschlüssel des Dokuments festzulegen. - Sie wird mit
[BsonRepresentation(BsonType.ObjectId)]kommentiert, um die Übergabe des Parameters als Typstringanstelle einer ObjectId-Struktur zu ermöglichen. Mongo behandelt die Konvertierung vonstringzuObjectId.
Die Eigenschaft
BookNameist mit dem Attribut[BsonElement]versehen. Der WertNamedes Attributs stellt den Eigenschaftsnamen in der MongoDB-Sammlung dar.
Hinzufügen eines Konfigurationsmodells
Fügen Sie
appsettings.jsondie folgenden Konfigurationswerte für die Datenbank hinzu:{ "BookstoreDatabaseSettings": { "BooksCollectionName": "Books", "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookstoreDb" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } }Fügen Sie dem Verzeichnis
BookstoreDatabaseSettings.csmit dem folgenden Code eine Datei hinzu: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; } } }Mit der vorhergehenden Klasse
BookstoreDatabaseSettingswerden die Eigenschaftswerteappsettings.jsonder DateiBookstoreDatabaseSettingsgespeichert. Die Namen der JSON- und der C#-Eigenschaften sind identisch, um den Zuordnungsprozess zu erleichtern.Fügen Sie folgenden hervorgehobenen Code zu
Startup.ConfigureServiceshinzu: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(); }Im vorhergehenden Code:
- Die Konfigurationsinstanz, an die der
appsettings.json-Abschnitt derBookstoreDatabaseSettings-Datei gebunden ist, ist im Dependency-Injection-Container registriert. Dies bedeutet, dass die EigenschaftBookstoreDatabaseSettingseinesConnectionString-Objekts beispielsweise mit der EigenschaftBookstoreDatabaseSettings:ConnectionStringinappsettings.jsonaufgefüllt wird. - Die
IBookstoreDatabaseSettingsSchnittstelle ist in DI mit Singleton-Dienstlebensdauer registriert. Beim Einfügen wird die Schnittstelleninstanz in einBookstoreDatabaseSettings-Objekt aufgelöst.
- Die Konfigurationsinstanz, an die der
Fügen Sie den folgenden Code am Anfang von
Startup.cshinzu, um dieBookstoreDatabaseSettings- undIBookstoreDatabaseSettings-Verweise aufzulösen:using BooksApi.Models;
Hinzufügen eines Diensts für CRUD-Operationen
Fügen Sie zum Stammverzeichnis des Projekts ein Verzeichnis Dienste hinzu.
Fügen Sie eine
BookService-Klasse zum Verzeichnis Dienste mit dem folgenden Code hinzu: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); } }Im vorhergehenden Code wird eine
IBookstoreDatabaseSettings-Instanz mittels Konstruktorinjektion über DI abgerufen. Damit kann auf die Konfigurationswerte vonappsettings.jsonzugegriffen werden, die im Abschnitt Hinzufügen eines Konfigurationsmodells hinzugefügt wurden.Fügen Sie folgenden hervorgehobenen Code zu
Startup.ConfigureServiceshinzu: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(); }Im vorhergehenden Code wird die Klasse
BookServicebei DI registriert, um die Konstruktorinjektion in verarbeitenden Klassen zu unterstützen. Die Lebensdauer des Singleton-Dienstes ist am geeignetsten, daBookServiceeine direkte Abhängigkeit vonMongoClienthat. Gemäß den offiziellen Mongo Client-Richtlinien zur Wiederverwendung (Mongo Client reuse guidelines) sollteMongoClientbei DI mit der Lebensdauer eines Singletondiensts registriert werden.Fügen Sie den folgenden Code am Anfang von
Startup.cshinzu, um den VerweisBookServiceaufzulösen:using BooksApi.Services;
Die BookService-Klasse verwendet die folgenden MongoDB.Driver-Member, um CRUD-Vorgänge für die Datenbank auszuführen:
MongoClient: Liest die Serverinstanz zum Ausführen von Datenbankvorgängen. Dem Konstruktor dieser Klasse wird die MongoDB-Verbindungszeichenfolge übergeben:
public BookService(IBookstoreDatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); _books = database.GetCollection<Book>(settings.BooksCollectionName); }IMongoDatabase: Stellt die Mongo-Datenbank zum Ausführen von Vorgängen dar. In diesem Tutorial wird die generische Methode GetCollection<TDocument>(collection) für die Schnittstelle verwendet, um Zugriff auf Daten in einer bestimmten Sammlung zu erhalten. Führen Sie CRUD-Vorgänge auf der Sammlung aus, nachdem diese Methode aufgerufen wurde. Rufen Sie in der
GetCollection<TDocument>(collection)-Methode folgendes auf:-
collectionsteht für den Sammlungsnamen. -
TDocumentsteht für den in der Sammlung gespeicherten CLR-Objekttypen.
-
GetCollection<TDocument>(collection) gibt ein MongoCollection-Objekt zurück, das die Sammlung darstellt. In diesem Tutorial werden die folgenden Methoden für die Sammlung aufgerufen:
- DeleteOne: Löscht das Einzeldokument, das den angegebenen Suchkriterien entspricht.
- Find<TDocument>: Gibt alle Dokumente in der Sammlung zurück, die den angegebenen Suchkriterien entsprechen.
- InsertOne: Fügt das angegebene Objekt als neues Dokument in die Sammlung ein.
- ReplaceOne: Ersetzt das Einzeldokument, das den angegebenen Suchkriterien entspricht, durch das angegebene Objekt.
Hinzufügen eines Controllers
Fügen Sie eine BooksController-Klasse zum Verzeichnis Controller mit dem folgenden Code hinzu:
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();
}
}
}
Der oben aufgeführte Web-API-Controller:
- Verwendet die
BookService-Klasse, um CRUD-Vorgänge auszuführen. - Enthält Aktionsmethoden zur Unterstützung von GET-, POST-, PUT- und DELETE HTTP-Anforderungen.
- Ruft CreatedAtRoute in der Aktionsmethode
Createauf, um eine HTTP 201-Antwort zurückzugeben. Der Statuscode 201 ist die Standardantwort für eine HTTP POST-Methode, die eine neue Ressource auf dem Server erstellt.CreatedAtRoutefügt der Antwort außerdem einenLocation-Header hinzu. DerLocation-Header gibt den URI des neu erstellten Buchs an.
Testen der Web-API
Erstellen Sie die App, und führen Sie sie aus.
Wechseln Sie zu
https://localhost:<port>/api/books, um die parameterlose AktionsmethodeGetdes Controllers zu testen. Die folgende JSON-Antwort wird angezeigt:[ { "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" } ]Wechseln Sie zu
https://localhost:<port>/api/books/{id here}, um die überladene AktionsmethodeGetdes Controllers zu testen. Die folgende JSON-Antwort wird angezeigt:{ "id":"{ID}", "bookName":"Clean Code", "price":43.15, "category":"Computers", "author":"Robert C. Martin" }
Konfigurieren von JSON-Serialisierungsoptionen
Es gibt zwei Details, die bei JSON-Antworten zu ändern sind, die im Abschnitt Testen der Web-API zurückgegeben werden:
- Die Camel-Case-Standardschreibweise von Eigenschaftsnamen sollte so geändert werden, dass sie der Pascal-Schreibweise der Eigenschaften des CLR-Objekts entspricht.
- Die Eigenschaft
bookNamesollte alsNamezurückgegeben werden.
Um die zuvor genannten Anforderungen zu erfüllen, nehmen Sie die folgenden Änderungen vor:
JSON.NET wurde aus dem freigegebenen ASP.NET-Framework entfernt. Fügen Sie
Microsoft.AspNetCore.Mvc.NewtonsoftJsoneinen Paketverweis hinzu.Verketten Sie in
Startup.ConfigureServicesden folgenden hervorgehobenen Code mit dem Aufruf derAddControllers-Methode: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()); }Durch die vorherige Änderung stimmen Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API mit ihren entsprechenden Eigenschaftsnamen im CLR-Objekttyp überein. Beispielsweise wird die Eigenschaft
BookderAuthor-Klasse alsAuthorserialisiert.Versehen Sie in
Models/Book.csdieBookName-Eigenschaft mit dem folgenden[JsonProperty]-Attribut:[BsonElement("Name")] [JsonProperty("Name")] public string BookName { get; set; }Der Wert
[JsonProperty]desName-Attributs stellt den Eigenschaftsnamen in der serialisierten JSON-Antwort der Web-API dar.Fügen Sie den folgenden Code am Anfang von
Models/Book.cshinzu, um den Verweis auf das[JsonProperty]-Attribut aufzulösen:using Newtonsoft.Json;Wiederholen Sie die im Abschnitt Testen der Web-API definierten Schritte. Beachten Sie den Unterschied bei den JSON-Eigenschaftsnamen.
Hinzufügen der Authentifizierungsunterstützung zu einer Web-API
ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu. Verwenden Sie zum Sichern von Web-APIs und SPAs eine der folgenden Optionen:
- Microsoft Entra-ID
- Duende IdentityServer. Duende IdentityServer ist ein Drittanbieterprodukt.
Duende IdentityServer ist ein OpenID Connect und OAuth 2.0 Framework für ASP.NET Core. Duende IdentityServer ermöglicht die folgenden Sicherheitsfeatures:
- Authentifizierung als Service (AaaS)
- Einmaliges Anmelden und einmaliges Abmelden für mehrere Anwendungstypen
- Zugriffssteuerung für APIs
- Föderationsgateway
Weitere Informationen finden Sie in der Übersicht über Duende IdentityServer.
Weitere Informationen zu anderen Authentifizierungsanbietern finden Sie unter Community-basierte OSS-Authentifizierungsoptionen für ASP.NET Core.
Nächste Schritte
Weitere Informationen zum Erstellen von ASP.NET-Core Web-APIs finden Sie in den folgenden Ressourcen: