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 Pratik Khandelwal und Scott Addie
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 der
mongosh-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu. - Windows: MongoDB Shell (mongosh.exe) wird unter C:\Users\user<\>AppData\Local\Programs\mongosh installiert. Fügen Sie der
mongosh.exe-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu.
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie der
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 der
mongodb-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu. - Windows: MongoDB wird standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie der Umgebungsvariablen < den Pfad > hinzu.
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie der
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 obigen Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden ist, beim DI-Container (Dependency Injection) 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 CRUD-Vorgangsdiensts
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 Singletondiensts ist am besten geeignet, daBooksServicedirekt vonMongoClientabhängig ist. 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 für die 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 der 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[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.
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, ähnlich wie das Folgende, an:
[ { "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 Antwortinhalt zeigt JSON, das ähnlich wie folgt ist:
{ "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. 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 Dienst
- 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 unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Dokumentation zu Duende Identity Server (Website von Duende Software).
Weitere Ressourcen
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 der
mongosh-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu. - Windows: MongoDB Shell (mongosh.exe) wird unter C:\Users\user<\>AppData\Local\Programs\mongosh installiert. Fügen Sie der
mongosh.exe-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu.
- macOS/Linux: Wählen Sie ein Verzeichnis aus, in das die MongoDB-Shell extrahiert werden soll. Fügen Sie der
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 der
mongodb-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu. - Windows: MongoDB wird standardmäßig unter C:\Programme\MongoDB installiert. Fügen Sie der Umgebungsvariablen < den Pfad > hinzu.
- macOS/Linux: Überprüfen Sie das Verzeichnis, unter dem MongoDB installiert wurde, in der Regel in /usr/local/mongodb. Fügen Sie der
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 obigen Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden ist, beim DI-Container (Dependency Injection) 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 CRUD-Vorgangsdiensts
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 Singletondiensts ist am besten geeignet, daBooksServicedirekt vonMongoClientabhängig ist. 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 für die 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 der 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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:[ { "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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:{ "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. 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 Dienst
- 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 unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Dokumentation zu Duende Identity Server (Website von Duende Software).
Weitere Ressourcen
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 der Umgebungsvariablen < den Pfad > hinzu.
Laden Sie die MongoDB-Shell herunter, und wählen Sie ein Verzeichnis aus, in das sie extrahiert werden soll. Fügen Sie der
mongosh.exe-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu.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-Laufzeitunterstützung) und 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 obigen Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden ist, beim DI-Container (Dependency Injection) 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 CRUD-Vorgangsdiensts
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 Singletondiensts ist am besten geeignet, daBooksServicedirekt vonMongoClientabhängig ist. 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 für die 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 der 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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:[ { "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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:{ "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. 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 Dienst
- 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 unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Dokumentation zu Duende Identity Server (Website von Duende Software).
Weitere Ressourcen
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 der Umgebungsvariablen < den Pfad > hinzu.
Laden Sie die MongoDB-Shell herunter, und wählen Sie ein Verzeichnis aus, in das sie extrahiert werden soll. Fügen Sie der
mongosh.exe-Umgebungsvariablen den resultierenden Pfad fürPATHhinzu.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 obigen Code wird die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookStoreDatabasegebunden ist, beim DI-Container (Dependency Injection) 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 CRUD-Vorgangsdiensts
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 Singletondiensts ist am besten geeignet, daBooksServicedirekt vonMongoClientabhängig ist. 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 für die 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 der 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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:[ { "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. Dadurch wird eine JSON-Antwort angezeigt, die mit der folgenden Ausgabe vergleichbar ist:{ "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. 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 Dienst
- 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 unter Migrieren von ASP.NET Core in .NET 5 zu .NET 6.
Weitere Informationen finden Sie in der Dokumentation zu Duende Identity Server (Website von Duende Software).
Weitere Ressourcen
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 der Umgebungsvariablen < den Pfad > 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 mit dem folgenden Code dem Verzeichnis
BookstoreDatabaseSettings.csdie Datei BookstoreDatabaseSettings.cs 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(); }Für den Code oben gilt:
- Die Konfigurationsinstanz, an die der Abschnitt
appsettings.jsonder DateiBookstoreDatabaseSettingsgebunden ist, ist beim Dependency-Injection-Container registriert. Dies bedeutet, dass die EigenschaftBookstoreDatabaseSettingseinesConnectionString-Objekts beispielsweise mit der EigenschaftBookstoreDatabaseSettings:ConnectionStringinappsettings.jsonaufgefüllt wird. - Die Schnittstelle
IBookstoreDatabaseSettingsist bei DI mit der Lebensdauer eines Singletondiensts registriert. Beim Einfügen wird die Schnittstelleninstanz in einBookstoreDatabaseSettings-Objekt aufgelöst.
- Die Konfigurationsinstanz, an die der Abschnitt
Fügen Sie den folgenden Code am Anfang von
Startup.cshinzu, um dieBookstoreDatabaseSettings- undIBookstoreDatabaseSettings-Verweise aufzulösen:using BooksApi.Models;
Hinzufügen eines CRUD-Vorgangsdiensts
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 Singletondiensts ist am besten geeignet, daBookServicedirekt vonMongoClientabhängig ist. 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. Der Konstruktor dieser Klasse wird in der MongoDB-Verbindungszeichenfolge bereitgestellt:
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 für die 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 der 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 Dienst
- 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: