Delen via


Een web-API maken met ASP.NET Core en MongoDB

Opmerking

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.

Waarschuwing

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.

Belangrijk

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikelvoor de huidige release.

Door Pratik Khandelwal en Scott Addie

In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.

In deze zelfstudie leert u het volgende:

  • MongoDB configureren
  • Een MongoDB-database maken
  • Een MongoDB-verzameling en -schema definiëren
  • MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
  • JSON-serialisatie aanpassen

Vereiste voorwaarden

MongoDB configureren

MongoDB- en MongoDB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen (Windows/Linux/macOS):

  1. MongoDB Shell downloaden en installeren:

    • macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor mongosh aan de PATH omgevingsvariabele toe.
    • Windows: MongoDB Shell (mongosh.exe) is geïnstalleerd op C:\Users\user<\>AppData\Local\Programs\mongosh. Voeg het resulterende pad voor mongosh.exe aan de PATH omgevingsvariabele toe.
  2. MongoDB downloaden en installeren:

    • macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor mongodb aan de PATH omgevingsvariabele toe.
    • Windows: MongoDB is standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de PATH omgevingsvariabele.
  3. Kies een gegevensopslagmap: selecteer een map op uw ontwikkelcomputer voor het opslaan van gegevens. Maak de map aan, als deze niet bestaat. Met de MongoDB-shell worden geen nieuwe mappen gemaakt:

    • macOS/Linux: bijvoorbeeld /usr/local/var/mongodb.
    • Windows: bijvoorbeeld C:\\BooksData.
  4. Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang <data_directory_path> door de map die u in de vorige stap hebt gekozen.

    mongod --dbpath <data_directory_path>
    

Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh.

  1. Open een MongoDB-opdrachtshell-exemplaar door het starten mongosh.exeof door de volgende opdracht uit te voeren in de opdrachtshell:

    mongosh
    
  2. Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:

    use BookStore
    

    Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.

  3. Maak een Books verzameling met behulp van de volgende opdracht:

    db.createCollection('Books')
    

    Het volgende resultaat wordt weergegeven:

    { "ok" : 1 }
    
  4. Definieer een schema voor de Books verzameling en voeg twee documenten in met behulp van de volgende opdracht:

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

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Opmerking

    De ObjectIdin het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.

  5. Bekijk de documenten in de database met behulp van de volgende opdracht:

    db.Books.find().pretty()
    

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Het schema voegt een automatisch gegenereerde _id eigenschap van het type ObjectId toe voor elk document.

Het ASP.NET Core-web-API-project maken

  1. Ga naar Bestand>Nieuw>Project.
  2. Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.
  3. Geef het project de naam BookStoreApi en selecteer Volgende.
  4. In het dialoogvenster Aanvullende informatie:
  • Controleer of de Framework is .NET 9.0 (Standaardterm Ondersteuning).
  • Controleer of het selectievakje voor Controllers gebruiken is ingeschakeld.
  • Controleer of het selectievakje voor OpenAPI-ondersteuning inschakelen is ingeschakeld.
  • Klik op Creëren.
  1. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:

    Install-Package MongoDB.Driver
    

Een entiteitsmodel toevoegen

  1. Voeg een Models-map toe aan de hoofdmap van het project.

  2. Voeg een Book klasse toe aan de map Modellen met de volgende code:

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

    In de voorgaande klasse is de Id eigenschap:

    • Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
    • Aangewezen met [BsonId] om van deze eigenschap de primaire sleutel van het document te maken.
    • Geannoteerd met [BsonRepresentation(BsonType.ObjectId)] zodat de parameter kan worden doorgegeven als type string in plaats van een ObjectId-structuur. Mongo verwerkt de conversie van string naar ObjectId.

    De BookName eigenschap wordt geannoteerd met het [BsonElement] kenmerk. De waarde van het kenmerk Name vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.

Een configuratiemodel toevoegen

  1. Voeg de volgende databaseconfiguratiewaarden toe aan appsettings.json:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. Voeg een BookStoreDatabaseSettings klasse toe aan de map Modellen met de volgende code:

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

    De voorgaande BookStoreDatabaseSettings klasse wordt gebruikt om de eigenschapswaarden van appsettings.json het BookStoreDatabase bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het appsettings.json bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. De BookStoreDatabaseSettings eigenschap van het ConnectionString object wordt bijvoorbeeld gevuld met de BookStoreDatabase:ConnectionString eigenschap in appsettings.json.

  4. Voeg de volgende code toe bovenaan Program.cs om de BookStoreDatabaseSettings verwijzing op te lossen:

    using BookStoreApi.Models;
    

Een CRUD-bewerkingsservice toevoegen

  1. Voeg een Services-directory toe aan de hoofdmap van het project.

  2. Voeg een BooksService klasse toe aan de Services directory met de volgende code:

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

    In de voorgaande code wordt een BookStoreDatabaseSettings exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot de appsettings.json configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt de BooksService klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdat BooksService een directe afhankelijkheid van MongoClient heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moet MongoClient worden geregistreerd in DI met een levensduur als een singleton-service.

  4. Voeg de volgende code toe bovenaan Program.cs om de BooksService verwijzing op te lossen:

    using BookStoreApi.Services;
    

De BooksService klasse gebruikt de volgende MongoDB.Driver leden om CRUD-bewerkingen uit te voeren op de database:

  • MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd in de MongoDB-verbindingsreeks:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de GetCollection<TDocument>(collection) methode-aanroep:

    • collection vertegenwoordigt de naam van de verzameling.
    • TDocument vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.

GetCollection<TDocument>(collection) retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:

  • DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
  • Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
  • InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
  • ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.

Een controller toevoegen

Voeg een BooksController klasse toe aan de map Controllers met de volgende code:

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

namespace BookStoreApi.Controllers;

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

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

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

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

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

        return book;
    }

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

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

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

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

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

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

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

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

De voorgaande web-API-controller:

  • Gebruikt de BooksService klasse om CRUD-bewerkingen uit te voeren.
  • Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
  • Roept CreatedAtAction de Create actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt. CreatedAtAction voegt ook een Location header toe aan het antwoord. De Location header geeft de URI van het zojuist gemaakte boek op.

Opties voor JSON-serialisatie configureren

Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:

  • De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
  • De bookName eigenschap moet worden geretourneerd als Name.

Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:

  1. In Program.cs, schakel de volgende gemarkeerde code aan de AddControllers methodeaanroep:

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

    Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De Book-eigenschap van de Author-klasse serialiseert bijvoorbeeld als Author in plaats van author.

  2. Annoteren in Models/Book.cs de BookName eigenschap met het [JsonPropertyName] kenmerk:

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

    De waarde van het [JsonPropertyName] kenmerk Name vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.

  3. Voeg de volgende code toe bovenaan Models/Book.cs om de [JsonProperty] kenmerkreferentie op te lossen:

    using System.Text.Json.Serialization;
    
  4. Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.

De web-API testen

In deze zelfstudie worden Endpoints Explorer- en HTTP-bestanden gebruikt om de API te testen.

  1. Bouw en voer de app uit.

  2. Klik in Endpoints Explorer met de rechtermuisknop op het eerste GET-eindpunt/api/booksen selecteer Aanvraag genereren.

    De volgende inhoud wordt toegevoegd aan het BookStoreApi.http bestand. Als dit de eerste keer is dat een aanvraag wordt gegenereerd, wordt het bestand gemaakt in de hoofdmap van het project.

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

    Het poortnummer moet al zijn ingesteld op de poort die wordt gebruikt door de app, https://localhost:56874bijvoorbeeld. Als dat niet het geval is, kunt u uw poortnummer vinden in het uitvoervenster wanneer u de app start.

  3. Selecteer de koppeling Aanvraag verzenden boven de nieuwe GET aanvraagregel.

    De GET-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord .

  4. In de hoofdtekst van het antwoord ziet u het JSON-resultaat met de boekvermeldingen die er ongeveer als volgt uitzien:

    [
      {
        "Id": "61a6058e6c43f32854e51f51",
        "Name": "Design Patterns",
        "Price": 54.93,
        "Category": "Computers",
        "Author": "Ralph Johnson"
      },
      {
        "Id": "61a6058e6c43f32854e51f52",
        "Name": "Clean Code",
        "Price": 43.15,
        "Category": "Computers",
        "Author": "Robert C. Martin"
      }
    ]
    
  5. Als u één boek wilt ophalen, klikt u met de rechtermuisknop op het /api/books/{id}, params (string id)GET-eindpunt in Endpoints Explorer en selecteert u Een aanvraag genereren.

    De volgende inhoud wordt toegevoegd aan het BookStoreApi.http bestand:

    @id=string
    GET {{BookStoreApi_HostAddress}}/api/books/{{id}}
    
    ###
    
  6. Vervang id de variabele door een van de id's die zijn geretourneerd door de eerdere aanvraag, bijvoorbeeld:

    @id="61a6058e6c43f32854e51f52"
    GET {{BookStoreApi_HostAddress}}/api/books/{{id}}
    
    ###
    
  7. Selecteer de koppeling Aanvraag verzenden boven de nieuwe GET aanvraagregel.

    De GET-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord .

  8. In de hoofdtekst van het antwoord ziet u JSON die vergelijkbaar is met het volgende:

    {
      "Id": "61a6058e6c43f32854e51f52",
      "Name": "Clean Code",
      "Price": 43.15,
      "Category": "Computers",
      "Author": "Robert C. Martin"
    }
    
  9. Als u het POST-eindpunt wilt testen, klikt u met de rechtermuisknop op het /api/booksPOST-eindpunt en selecteert u Aanvraag genereren.

    De volgende inhoud wordt toegevoegd aan het BookStoreApi.http-bestand:

    POST {{BookStoreApi_HostAddress}}/api/books
    Content-Type: application/json
    
    {
      //Book
    }
    
    ###
    
  10. Vervang de opmerking Boek door een boekobject als de hoofdtekst van de JSON-aanvraag:

    POST {{BookStoreApi_HostAddress}}/api/books
    Content-Type: application/json
    
     {
       "Name": "The Pragmatic Programmer",
       "Price": 49.99,
       "Category": "Computers",
       "Author": "Andy Hunt"
     }
    
    ###
    
  11. Selecteer de koppeling Aanvraag verzenden boven de POST aanvraagregel.

    De POST-aanvraag wordt verzonden naar de app en het antwoord wordt weergegeven in het deelvenster Antwoord . Het antwoord moet het zojuist gemaakte boek bevatten met de toegewezen ID.

  12. Als u ten slotte een boek wilt verwijderen, klikt u met de rechtermuisknop op het /api/books/{id}, params (string id) eindpunt VERWIJDEREN en selecteert u Aanvraag genereren.

    De volgende inhoud wordt toegevoegd aan het BookStoreApi.http bestand:

    DELETE {{BookStoreApi_HostAddress}}/api/Books/{{id}}
    
    ###
    
  13. Vervang de id variabele door een van de id's die zijn geretourneerd uit de eerdere aanvraag en klik op Aanvraag verzenden. Voorbeeld:

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

Verificatieondersteuning toevoegen aan een web-API

ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:

Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:

  • Verificatie als een service (AaaS)
  • Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
  • Toegangsbeheer voor API's
  • Federatie-gateway

Belangrijk

Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.

Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.

Aanvullende bronnen

In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.

In deze zelfstudie leert u het volgende:

  • MongoDB configureren
  • Een MongoDB-database maken
  • Een MongoDB-verzameling en -schema definiëren
  • MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
  • JSON-serialisatie aanpassen

Vereiste voorwaarden

MongoDB configureren

MongoDB- en MongoDB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen (Windows/Linux/macOS):

  1. MongoDB Shell downloaden en installeren:

    • macOS/Linux: kies een map waarin u de MongoDB-shell wilt extraheren. Voeg het resulterende pad voor mongosh aan de PATH omgevingsvariabele toe.
    • Windows: MongoDB Shell (mongosh.exe) is geïnstalleerd op C:\Users\user<\>AppData\Local\Programs\mongosh. Voeg het resulterende pad voor mongosh.exe aan de PATH omgevingsvariabele toe.
  2. MongoDB downloaden en installeren:

    • macOS/Linux: Controleer de map waarin MongoDB is geïnstalleerd, meestal in /usr/local/mongodb. Voeg het resulterende pad voor mongodb aan de PATH omgevingsvariabele toe.
    • Windows: MongoDB is standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de PATH omgevingsvariabele.
  3. Kies een gegevensopslagmap: selecteer een map op uw ontwikkelcomputer voor het opslaan van gegevens. Maak de map aan, als deze niet bestaat. Met de MongoDB-shell worden geen nieuwe mappen gemaakt:

    • macOS/Linux: bijvoorbeeld /usr/local/var/mongodb.
    • Windows: bijvoorbeeld C:\\BooksData.
  4. Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang <data_directory_path> door de map die u in de vorige stap hebt gekozen.

    mongod --dbpath <data_directory_path>
    

Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh.

  1. Open een MongoDB-opdrachtshell-exemplaar door het starten mongosh.exeof door de volgende opdracht uit te voeren in de opdrachtshell:

    mongosh
    
  2. Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:

    use BookStore
    

    Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.

  3. Maak een Books verzameling met behulp van de volgende opdracht:

    db.createCollection('Books')
    

    Het volgende resultaat wordt weergegeven:

    { "ok" : 1 }
    
  4. Definieer een schema voor de Books verzameling en voeg twee documenten in met behulp van de volgende opdracht:

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

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Opmerking

    De ObjectIdin het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.

  5. Bekijk de documenten in de database met behulp van de volgende opdracht:

    db.Books.find().pretty()
    

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Het schema voegt een automatisch gegenereerde _id eigenschap van het type ObjectId toe voor elk document.

Het ASP.NET Core-web-API-project maken

  1. Ga naar Bestand>Nieuw>Project.

  2. Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.

  3. Geef het project de naam BookStoreApi en selecteer Volgende.

  4. Selecteer het framework voor .NET 8.0 (langetermijnondersteuning) en selecteer Maken.

  5. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:

    Install-Package MongoDB.Driver
    

Een entiteitsmodel toevoegen

  1. Voeg een Models-map toe aan de hoofdmap van het project.

  2. Voeg een Book klasse toe aan de map Modellen met de volgende code:

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

    In de voorgaande klasse is de Id eigenschap:

    • Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
    • Aangewezen met [BsonId] om van deze eigenschap de primaire sleutel van het document te maken.
    • Geannoteerd met [BsonRepresentation(BsonType.ObjectId)] zodat de parameter kan worden doorgegeven als type string in plaats van een ObjectId-structuur. Mongo verwerkt de conversie van string naar ObjectId.

    De BookName eigenschap wordt geannoteerd met het [BsonElement] kenmerk. De waarde van het kenmerk Name vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.

Een configuratiemodel toevoegen

  1. Voeg de volgende databaseconfiguratiewaarden toe aan appsettings.json:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. Voeg een BookStoreDatabaseSettings klasse toe aan de map Modellen met de volgende code:

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

    De voorgaande BookStoreDatabaseSettings klasse wordt gebruikt om de eigenschapswaarden van appsettings.json het BookStoreDatabase bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het appsettings.json bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. De BookStoreDatabaseSettings eigenschap van het ConnectionString object wordt bijvoorbeeld gevuld met de BookStoreDatabase:ConnectionString eigenschap in appsettings.json.

  4. Voeg de volgende code toe bovenaan Program.cs om de BookStoreDatabaseSettings verwijzing op te lossen:

    using BookStoreApi.Models;
    

Een CRUD-bewerkingsservice toevoegen

  1. Voeg een Services-directory toe aan de hoofdmap van het project.

  2. Voeg een BooksService klasse toe aan de Services directory met de volgende code:

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

    In de voorgaande code wordt een BookStoreDatabaseSettings exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot de appsettings.json configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt de BooksService klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdat BooksService een directe afhankelijkheid van MongoClient heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moet MongoClient worden geregistreerd in DI met een levensduur als een singleton-service.

  4. Voeg de volgende code toe bovenaan Program.cs om de BooksService verwijzing op te lossen:

    using BookStoreApi.Services;
    

De BooksService klasse gebruikt de volgende MongoDB.Driver leden om CRUD-bewerkingen uit te voeren op de database:

  • MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd in de MongoDB-verbindingsreeks:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de GetCollection<TDocument>(collection) methode-aanroep:

    • collection vertegenwoordigt de naam van de verzameling.
    • TDocument vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.

GetCollection<TDocument>(collection) retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:

  • DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
  • Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
  • InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
  • ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.

Een controller toevoegen

Voeg een BooksController klasse toe aan de map Controllers met de volgende code:

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

namespace BookStoreApi.Controllers;

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

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

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

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

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

        return book;
    }

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

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

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

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

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

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

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

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

De voorgaande web-API-controller:

  • Gebruikt de BooksService klasse om CRUD-bewerkingen uit te voeren.
  • Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
  • Roept CreatedAtAction de Create actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt. CreatedAtAction voegt ook een Location header toe aan het antwoord. De Location header geeft de URI van het zojuist gemaakte boek op.

De web-API testen

  1. Bouw en voer de app uit.

  2. Navigeer naar https://localhost:<port>/api/books, waar <port> is het automatisch toegewezen poortnummer voor de app, om de parameterloze Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. Navigeer naar https://localhost:<port>/api/books/{id here} om de overbelaste Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

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

Opties voor JSON-serialisatie configureren

Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:

  • De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
  • De bookName eigenschap moet worden geretourneerd als Name.

Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:

  1. In Program.cs, schakel de volgende gemarkeerde code aan de AddControllers methodeaanroep:

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

    Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De Book-eigenschap van de Author-klasse serialiseert bijvoorbeeld als Author in plaats van author.

  2. Annoteren in Models/Book.cs de BookName eigenschap met het [JsonPropertyName] kenmerk:

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

    De waarde van het [JsonPropertyName] kenmerk Name vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.

  3. Voeg de volgende code toe bovenaan Models/Book.cs om de [JsonProperty] kenmerkreferentie op te lossen:

    using System.Text.Json.Serialization;
    
  4. Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.

Verificatieondersteuning toevoegen aan een web-API

ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:

Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:

  • Verificatie als een service (AaaS)
  • Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
  • Toegangsbeheer voor API's
  • Federatie-gateway

Belangrijk

Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.

Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.

Aanvullende bronnen

In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.

In deze zelfstudie leert u het volgende:

  • MongoDB configureren
  • Een MongoDB-database maken
  • Een MongoDB-verzameling en -schema definiëren
  • MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
  • JSON-serialisatie aanpassen

Vereiste voorwaarden

MongoDB configureren

MongoDB- en Mongo DB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen:

  1. In Windows wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de PATH omgevingsvariabele.

  2. Download de MongoDB Shell en kies een map om deze uit te pakken. Voeg het resulterende pad voor mongosh.exe aan de PATH omgevingsvariabele toe.

  3. Kies een map op de ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.

  4. Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang <data_directory_path> door de map die u in de vorige stap hebt gekozen.

    mongod --dbpath <data_directory_path>
    

Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh.

  1. Open een MongoDB-opdrachtshell-exemplaar door het starten mongosh.exeof door de volgende opdracht uit te voeren in de opdrachtshell:

    mongosh
    
  2. Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:

    use BookStore
    

    Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.

  3. Maak een Books verzameling met behulp van de volgende opdracht:

    db.createCollection('Books')
    

    Het volgende resultaat wordt weergegeven:

    { "ok" : 1 }
    
  4. Definieer een schema voor de Books verzameling en voeg twee documenten in met behulp van de volgende opdracht:

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

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Opmerking

    De ObjectIdin het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.

  5. Bekijk de documenten in de database met behulp van de volgende opdracht:

    db.Books.find().pretty()
    

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Het schema voegt een automatisch gegenereerde _id eigenschap van het type ObjectId toe voor elk document.

Het ASP.NET Core-web-API-project maken

  1. Ga naar Bestand>Nieuw>Project.

  2. Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.

  3. Geef het project de naam BookStoreApi en selecteer Volgende.

  4. Selecteer het framework .NET 7.0 (Standard Term Support) en selecteer Maken.

  5. Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

  6. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:

    Install-Package MongoDB.Driver
    

Een entiteitsmodel toevoegen

  1. Voeg een Models-map toe aan de hoofdmap van het project.

  2. Voeg een Book klasse toe aan de map Modellen met de volgende code:

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

    In de voorgaande klasse is de Id eigenschap:

    • Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
    • Aangewezen met [BsonId] om van deze eigenschap de primaire sleutel van het document te maken.
    • Geannoteerd met [BsonRepresentation(BsonType.ObjectId)] zodat de parameter kan worden doorgegeven als type string in plaats van een ObjectId-structuur. Mongo verwerkt de conversie van string naar ObjectId.

    De BookName eigenschap wordt geannoteerd met het [BsonElement] kenmerk. De waarde van het kenmerk Name vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.

Een configuratiemodel toevoegen

  1. Voeg de volgende databaseconfiguratiewaarden toe aan appsettings.json:

    {
      "BookStoreDatabase": {
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookStore",
        "BooksCollectionName": "Books"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. Voeg een BookStoreDatabaseSettings klasse toe aan de map Modellen met de volgende code:

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

    De voorgaande BookStoreDatabaseSettings klasse wordt gebruikt om de eigenschapswaarden van appsettings.json het BookStoreDatabase bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het appsettings.json bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. De BookStoreDatabaseSettings eigenschap van het ConnectionString object wordt bijvoorbeeld gevuld met de BookStoreDatabase:ConnectionString eigenschap in appsettings.json.

  4. Voeg de volgende code toe bovenaan Program.cs om de BookStoreDatabaseSettings verwijzing op te lossen:

    using BookStoreApi.Models;
    

Een CRUD-bewerkingsservice toevoegen

  1. Voeg een Services-directory toe aan de hoofdmap van het project.

  2. Voeg een BooksService klasse toe aan de Services directory met de volgende code:

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

    In de voorgaande code wordt een BookStoreDatabaseSettings exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot de appsettings.json configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt de BooksService klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdat BooksService een directe afhankelijkheid van MongoClient heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moet MongoClient worden geregistreerd in DI met een levensduur als een singleton-service.

  4. Voeg de volgende code toe bovenaan Program.cs om de BooksService verwijzing op te lossen:

    using BookStoreApi.Services;
    

De BooksService klasse gebruikt de volgende MongoDB.Driver leden om CRUD-bewerkingen uit te voeren op de database:

  • MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de GetCollection<TDocument>(collection) methode-aanroep:

    • collection vertegenwoordigt de naam van de verzameling.
    • TDocument vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.

GetCollection<TDocument>(collection) retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:

  • DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
  • Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
  • InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
  • ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.

Een controller toevoegen

Voeg een BooksController klasse toe aan de map Controllers met de volgende code:

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

namespace BookStoreApi.Controllers;

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

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

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

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

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

        return book;
    }

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

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

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

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

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

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

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

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

De voorgaande web-API-controller:

  • Gebruikt de BooksService klasse om CRUD-bewerkingen uit te voeren.
  • Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
  • Roept CreatedAtAction de Create actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt. CreatedAtAction voegt ook een Location header toe aan het antwoord. De Location header geeft de URI van het zojuist gemaakte boek op.

De web-API testen

  1. Bouw en voer de app uit.

  2. Navigeer naar https://localhost:<port>/api/books, waar <port> is het automatisch toegewezen poortnummer voor de app, om de parameterloze Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. Navigeer naar https://localhost:<port>/api/books/{id here} om de overbelaste Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

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

Opties voor JSON-serialisatie configureren

Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:

  • De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
  • De bookName eigenschap moet worden geretourneerd als Name.

Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:

  1. In Program.cs, schakel de volgende gemarkeerde code aan de AddControllers methodeaanroep:

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

    Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De Book-eigenschap van de Author-klasse serialiseert bijvoorbeeld als Author in plaats van author.

  2. Annoteren in Models/Book.cs de BookName eigenschap met het [JsonPropertyName] kenmerk:

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

    De waarde van het [JsonPropertyName] kenmerk Name vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.

  3. Voeg de volgende code toe bovenaan Models/Book.cs om de [JsonProperty] kenmerkreferentie op te lossen:

    using System.Text.Json.Serialization;
    
  4. Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.

Verificatieondersteuning toevoegen aan een web-API

ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:

Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:

  • Verificatie als een service (AaaS)
  • Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
  • Toegangsbeheer voor API's
  • Federatie-gateway

Belangrijk

Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.

Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.

Aanvullende bronnen

In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.

In deze zelfstudie leert u het volgende:

  • MongoDB configureren
  • Een MongoDB-database maken
  • Een MongoDB-verzameling en -schema definiëren
  • MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
  • JSON-serialisatie aanpassen

Vereiste voorwaarden

MongoDB configureren

MongoDB- en Mongo DB Shell-toegang vanaf elke locatie op de ontwikkelcomputer inschakelen:

  1. In Windows wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de PATH omgevingsvariabele.

  2. Download de MongoDB Shell en kies een map om deze uit te pakken. Voeg het resulterende pad voor mongosh.exe aan de PATH omgevingsvariabele toe.

  3. Kies een map op de ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.

  4. Gebruik in de opdrachtshell van het besturingssysteem (niet de MongoDB-shell) de volgende opdracht om verbinding te maken met MongoDB op standaardpoort 27017. Vervang <data_directory_path> door de map die u in de vorige stap hebt gekozen.

    mongod --dbpath <data_directory_path>
    

Gebruik de eerder geïnstalleerde MongoDB Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie voor meer informatie over MongoDB Shell-opdrachten mongosh.

  1. Open een MongoDB-opdrachtshell-exemplaar door het starten mongosh.exeof door de volgende opdracht uit te voeren in de opdrachtshell:

    mongosh
    
  2. Maak in de opdrachtshell verbinding met de standaardtestdatabase door het volgende uit te voeren:

    use BookStore
    

    Er wordt een database met de naam BookStore gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.

  3. Maak een Books verzameling met behulp van de volgende opdracht:

    db.createCollection('Books')
    

    Het volgende resultaat wordt weergegeven:

    { "ok" : 1 }
    
  4. Definieer een schema voor de Books verzameling en voeg twee documenten in met behulp van de volgende opdracht:

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

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Opmerking

    De ObjectIdin het voorgaande resultaat weergegeven resultaten komen niet overeen met de resultaten die worden weergegeven in de opdrachtshell.

  5. Bekijk de documenten in de database met behulp van de volgende opdracht:

    db.Books.find().pretty()
    

    Er wordt een resultaat weergegeven dat lijkt op het volgende:

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

    Het schema voegt een automatisch gegenereerde _id eigenschap van het type ObjectId toe voor elk document.

Het ASP.NET Core-web-API-project maken

  1. Ga naar Bestand>Nieuw>Project.

  2. Selecteer het projecttype ASP.NET Core Web API en selecteer Volgende.

  3. Geef het project de naam BookStoreApi en selecteer Volgende.

  4. Selecteer het framework voor .NET 6.0 (langetermijnondersteuning) en selecteer Maken.

  5. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:

    Install-Package MongoDB.Driver
    

Een entiteitsmodel toevoegen

  1. Voeg een Models-map toe aan de hoofdmap van het project.

  2. Voeg een Book klasse toe aan de map Modellen met de volgende code:

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

    In de voorgaande klasse is de Id eigenschap:

    • Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
    • Aangewezen met [BsonId] om van deze eigenschap de primaire sleutel van het document te maken.
    • Geannoteerd met [BsonRepresentation(BsonType.ObjectId)] zodat de parameter kan worden doorgegeven als type string in plaats van een ObjectId-structuur. Mongo verwerkt de conversie van string naar ObjectId.

    De BookName eigenschap wordt geannoteerd met het [BsonElement] kenmerk. De waarde van het kenmerk Name vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.

Een configuratiemodel toevoegen

  1. Voeg de volgende databaseconfiguratiewaarden toe aan appsettings.json:

    {
        "BookStoreDatabase": {
            "ConnectionString": "mongodb://localhost:27017",
            "DatabaseName": "BookStore",
            "BooksCollectionName": "Books"
        },
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "AllowedHosts": "*"
    }
    
  2. Voeg een BookStoreDatabaseSettings klasse toe aan de map Modellen met de volgende code:

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

    De voorgaande BookStoreDatabaseSettings klasse wordt gebruikt om de eigenschapswaarden van appsettings.json het BookStoreDatabase bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt het configuratie-exemplaar waaraan de sectie van het appsettings.json bestand is gekoppeld, geregistreerd in de Dependency Injection (DI) container. De BookStoreDatabaseSettings eigenschap van het ConnectionString object wordt bijvoorbeeld gevuld met de BookStoreDatabase:ConnectionString eigenschap in appsettings.json.

  4. Voeg de volgende code toe bovenaan Program.cs om de BookStoreDatabaseSettings verwijzing op te lossen:

    using BookStoreApi.Models;
    

Een CRUD-bewerkingsservice toevoegen

  1. Voeg een Services-directory toe aan de hoofdmap van het project.

  2. Voeg een BooksService klasse toe aan de Services directory met de volgende code:

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

    In de voorgaande code wordt een BookStoreDatabaseSettings exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot de appsettings.json configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .

  3. Voeg de volgende gemarkeerde code toe aan Program.cs:

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

    In de voorgaande code wordt de BooksService klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdat BooksService een directe afhankelijkheid van MongoClient heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moet MongoClient worden geregistreerd in DI met een levensduur als een singleton-service.

  4. Voeg de volgende code toe bovenaan Program.cs om de BooksService verwijzing op te lossen:

    using BookStoreApi.Services;
    

De BooksService klasse gebruikt de volgende MongoDB.Driver leden om CRUD-bewerkingen uit te voeren op de database:

  • MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:

    public BooksService(
        IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings)
    {
        var mongoClient = new MongoClient(
            bookStoreDatabaseSettings.Value.ConnectionString);
    
        var mongoDatabase = mongoClient.GetDatabase(
            bookStoreDatabaseSettings.Value.DatabaseName);
    
        _booksCollection = mongoDatabase.GetCollection<Book>(
            bookStoreDatabaseSettings.Value.BooksCollectionName);
    }
    
  • IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de GetCollection<TDocument>(collection) methode-aanroep:

    • collection vertegenwoordigt de naam van de verzameling.
    • TDocument vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.

GetCollection<TDocument>(collection) retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:

  • DeleteOneAsync: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
  • Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
  • InsertOneAsync: Voegt het opgegeven object in als een nieuw document in de verzameling.
  • ReplaceOneAsync: vervangt het document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.

Een controller toevoegen

Voeg een BooksController klasse toe aan de map Controllers met de volgende code:

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

namespace BookStoreApi.Controllers;

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

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

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

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

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

        return book;
    }

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

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

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

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

        updatedBook.Id = book.Id;

        await _booksService.UpdateAsync(id, updatedBook);

        return NoContent();
    }

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

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

        await _booksService.RemoveAsync(id);

        return NoContent();
    }
}

De voorgaande web-API-controller:

  • Gebruikt de BooksService klasse om CRUD-bewerkingen uit te voeren.
  • Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
  • Roept CreatedAtAction de Create actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt. CreatedAtAction voegt ook een Location header toe aan het antwoord. De Location header geeft de URI van het zojuist gemaakte boek op.

De web-API testen

  1. Bouw en voer de app uit.

  2. Navigeer naar https://localhost:<port>/api/books, waar <port> is het automatisch toegewezen poortnummer voor de app, om de parameterloze Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

    [
      {
        "id": "61a6058e6c43f32854e51f51",
        "bookName": "Design Patterns",
        "price": 54.93,
        "category": "Computers",
        "author": "Ralph Johnson"
      },
      {
        "id": "61a6058e6c43f32854e51f52",
        "bookName": "Clean Code",
        "price": 43.15,
        "category": "Computers",
        "author": "Robert C. Martin"
      }
    ]
    
  3. Navigeer naar https://localhost:<port>/api/books/{id here} om de overbelaste Get actiemethode van de controller te testen. Er wordt een JSON-antwoord weergegeven dat lijkt op het volgende:

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

Opties voor JSON-serialisatie configureren

Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:

  • De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
  • De bookName eigenschap moet worden geretourneerd als Name.

Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:

  1. In Program.cs, schakel de volgende gemarkeerde code aan de AddControllers methodeaanroep:

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

    Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De Book-eigenschap van de Author-klasse serialiseert bijvoorbeeld als Author in plaats van author.

  2. Annoteren in Models/Book.cs de BookName eigenschap met het [JsonPropertyName] kenmerk:

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

    De waarde van het [JsonPropertyName] kenmerk Name vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.

  3. Voeg de volgende code toe bovenaan Models/Book.cs om de [JsonProperty] kenmerkreferentie op te lossen:

    using System.Text.Json.Serialization;
    
  4. Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.

Verificatieondersteuning toevoegen aan een web-API

ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:

Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:

  • Verificatie als een service (AaaS)
  • Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
  • Toegangsbeheer voor API's
  • Federatie-gateway

Belangrijk

Duende Software moet u mogelijk een licentiekosten betalen voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.

Zie de Duende Identity Server-documentatie (Duende Software-website)voor meer informatie.

Aanvullende bronnen

In deze zelfstudie maakt u een web-API die CRUD-bewerkingen (Create, Read, Update en Delete) uitvoert op een MongoDB NoSQL-database.

In deze zelfstudie leert u het volgende:

  • MongoDB configureren
  • Een MongoDB-database maken
  • Een MongoDB-verzameling en -schema definiëren
  • MongoDB CRUD-bewerkingen uitvoeren vanuit een web-API
  • JSON-serialisatie aanpassen

Voorbeeldcode bekijken of downloaden (hoe download je)

Vereiste voorwaarden

MongoDB configureren

Als u Windows gebruikt, wordt MongoDB standaard geïnstalleerd op C:\Program Files\MongoDB . Voeg C:\Program Files\MongoDB\Server\<version_number>\bin toe aan de Path omgevingsvariabele. Met deze wijziging is MongoDB-toegang vanaf elke locatie op uw ontwikkelcomputer mogelijk.

Gebruik de Mongo Shell in de volgende stappen om een database te maken, verzamelingen te maken en documenten op te slaan. Zie Werken met mongo Shell-opdrachten voor meer informatie over mongo Shell-opdrachten.

  1. Kies een map op uw ontwikkelcomputer voor het opslaan van de gegevens. Bijvoorbeeld C:\BooksData in Windows. Maak de map aan, als deze niet bestaat. De Mongo Shell maakt geen nieuwe directory's.

  2. Open een opdrachtprompt. Voer de volgende opdracht uit om verbinding te maken met MongoDB op standaardpoort 27017. Vergeet niet om <data_directory_path> te vervangen door de map die u in de vorige stap hebt gekozen.

    mongod --dbpath <data_directory_path>
    
  3. Open een andere instantie van de opdrachtprompt. Maak verbinding met de standaardtestdatabase door de volgende opdracht uit te voeren:

    mongo
    
  4. Voer de volgende opdracht uit in een opdrachtshell:

    use BookstoreDb
    

    Er wordt een database met de naam BookstoreDb gemaakt als deze nog niet bestaat. Als de database wel bestaat, wordt de verbinding geopend voor transacties.

  5. Maak een Books verzameling met behulp van de volgende opdracht:

    db.createCollection('Books')
    

    Het volgende resultaat wordt weergegeven:

    { "ok" : 1 }
    
  6. Definieer een schema voor de Books verzameling en voeg twee documenten in met behulp van de volgende opdracht:

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

    Het volgende resultaat wordt weergegeven:

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

    Opmerking

    De id's die in dit artikel worden weergegeven, komen niet overeen met de id's wanneer u dit voorbeeld uitvoert.

  7. Bekijk de documenten in de database met behulp van de volgende opdracht:

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

    Het volgende resultaat wordt weergegeven:

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

    Het schema voegt een automatisch gegenereerde _id eigenschap van het type ObjectId toe voor elk document.

De database is gereed. U kunt beginnen met het maken van de ASP.NET Core-web-API.

Het ASP.NET Core-web-API-project maken

  1. Ga naar Bestand>Nieuw>Project.

  2. Selecteer het projecttype ASP.NET Core Web Application en selecteer Volgende.

  3. Geef het project de naam BooksApi en selecteer Maken.

  4. Selecteer het .NET Core-doelframework en ASP.NET Core 3.0. Selecteer het API projectsjabloon en klik op Maken.

  5. Ga naar de NuGet Gallery: MongoDB.Driver om de meest recente stabiele versie van het .NET-stuurprogramma voor MongoDB te bepalen. Navigeer in het Package Manager Console-venster naar de hoofdmap van het project. Voer de volgende opdracht uit om het .NET-stuurprogramma voor MongoDB te installeren:

    Install-Package MongoDB.Driver -Version {VERSION}
    

Een entiteitsmodel toevoegen

  1. Voeg een Models-map toe aan de hoofdmap van het project.

  2. Voeg een Book klasse toe aan de map Modellen met de volgende code:

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

    In de voorgaande klasse is de Id eigenschap:

    • Vereist voor het toewijzen van het CLR-object (Common Language Runtime) aan de MongoDB-verzameling.
    • Aangewezen met [BsonId] om van deze eigenschap de primaire sleutel van het document te maken.
    • Geannoteerd met [BsonRepresentation(BsonType.ObjectId)] zodat de parameter kan worden doorgegeven als type string in plaats van een ObjectId-structuur. Mongo verwerkt de conversie van string naar ObjectId.

    De BookName eigenschap wordt geannoteerd met het [BsonElement] kenmerk. De waarde van het kenmerk Name vertegenwoordigt de eigenschapsnaam in de MongoDB-verzameling.

Een configuratiemodel toevoegen

  1. Voeg de volgende databaseconfiguratiewaarden toe aan appsettings.json:

    {
      "BookstoreDatabaseSettings": {
        "BooksCollectionName": "Books",
        "ConnectionString": "mongodb://localhost:27017",
        "DatabaseName": "BookstoreDb"
      },
      "Logging": {
        "IncludeScopes": false,
        "Debug": {
          "LogLevel": {
            "Default": "Warning"
          }
        },
        "Console": {
          "LogLevel": {
            "Default": "Warning"
          }
        }
      }
    }
    
  2. Voeg een BookstoreDatabaseSettings.cs bestand toe aan de map Modellen met de volgende code:

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

    De voorgaande BookstoreDatabaseSettings klasse wordt gebruikt om de eigenschapswaarden van appsettings.json het BookstoreDatabaseSettings bestand op te slaan. De namen van de JSON- en C#-eigenschappen zijn identiek om het koppelingproces te vereenvoudigen.

  3. Voeg de volgende gemarkeerde code toe aan Startup.ConfigureServices:

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

    In de voorgaande code:

    • Het configuratie-exemplaar waaraan de sectie appsettings.json van het BookstoreDatabaseSettings bestand is gekoppeld, wordt geregistreerd in de Dependency Injection (DI) container. Een BookstoreDatabaseSettings object's ConnectionString eigenschap wordt bijvoorbeeld gevuld met de BookstoreDatabaseSettings:ConnectionString eigenschap in appsettings.json.
    • De IBookstoreDatabaseSettings interface is geregistreerd in DI als een singleton met een levensduur van de service. Wanneer deze wordt geïnjecteerd, wordt het interface-exemplaar omgezet in een BookstoreDatabaseSettings object.
  4. Voeg de volgende code toe bovenaan Startup.cs om de BookstoreDatabaseSettings en IBookstoreDatabaseSettings verwijzingen op te lossen:

    using BooksApi.Models;
    

Een CRUD-bewerkingsservice toevoegen

  1. Voeg een Services-directory toe aan de hoofdmap van het project.

  2. Voeg een BookService klasse toe aan de Services directory met de volgende code:

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

    In de voorgaande code wordt een IBookstoreDatabaseSettings exemplaar opgehaald uit DI via constructorinjectie. Deze techniek biedt toegang tot de appsettings.json configuratiewaarden die zijn toegevoegd in de sectie Een configuratiemodel toevoegen .

  3. Voeg de volgende gemarkeerde code toe aan Startup.ConfigureServices:

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

    In de voorgaande code wordt de BookService klasse geregistreerd bij DI ter ondersteuning van constructorinjectie in verbruiksklassen. De levensduur van de singleton-service is het meest geschikt omdat BookService een directe afhankelijkheid van MongoClient heeft. Volgens de officiële richtlijnen voor hergebruik van Mongo-clients moet MongoClient worden geregistreerd in DI met een levensduur als een singleton-service.

  4. Voeg de volgende code toe bovenaan Startup.cs om de BookService verwijzing op te lossen:

    using BooksApi.Services;
    

De BookService klasse gebruikt de volgende MongoDB.Driver leden om CRUD-bewerkingen uit te voeren op de database:

  • MongoClient: leest een serverexemplaar voor het uitvoeren van databasebewerkingen. De constructor van deze klasse wordt geleverd met de MongoDB-verbindingsreeks:

    public BookService(IBookstoreDatabaseSettings settings)
    {
        var client = new MongoClient(settings.ConnectionString);
        var database = client.GetDatabase(settings.DatabaseName);
    
        _books = database.GetCollection<Book>(settings.BooksCollectionName);
    }
    
  • IMongoDatabase: Vertegenwoordigt de Mongo-database voor het uitvoeren van bewerkingen. In deze zelfstudie wordt gebruikgemaakt van de algemene Methode GetCollection<TDocument>(collection) op de interface om toegang te krijgen tot gegevens in een specifieke verzameling. Voer CRUD-bewerkingen uit op de verzameling nadat deze methode is aangeroepen. In de GetCollection<TDocument>(collection) methode-aanroep:

    • collection vertegenwoordigt de naam van de verzameling.
    • TDocument vertegenwoordigt het CLR-objecttype dat is opgeslagen in de verzameling.

GetCollection<TDocument>(collection) retourneert een MongoCollection-object dat de verzameling vertegenwoordigt. In deze handleiding worden de volgende methoden aangeroepen voor de verzameling:

  • DeleteOne: Hiermee verwijdert u één document dat overeenkomt met de opgegeven zoekcriteria.
  • Vinden<TDocument>: retourneert alle documenten in de verzameling die overeenkomen met de opgegeven zoekcriteria.
  • InsertOne: Voegt het opgegeven object in als een nieuw document in de verzameling.
  • ReplaceOne: Vervangt het enkele document dat overeenkomt met de opgegeven zoekcriteria door het opgegeven object.

Een controller toevoegen

Voeg een BooksController klasse toe aan de map Controllers met de volgende code:

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

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

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

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

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

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

            return book;
        }

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

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

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

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

            _bookService.Update(id, bookIn);

            return NoContent();
        }

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

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

            _bookService.Remove(id);

            return NoContent();
        }
    }
}

De voorgaande web-API-controller:

  • Gebruikt de BookService klasse om CRUD-bewerkingen uit te voeren.
  • Bevat actiemethoden ter ondersteuning van HTTP-aanvragen voor GET-, POST-, PUT- en DELETE-aanvragen.
  • Roept CreatedAtRoute de Create actiemethode aan om een HTTP 201-antwoord te retourneren. Statuscode 201 is het standaardantwoord voor een HTTP POST-methode waarmee een nieuwe resource op de server wordt gemaakt. CreatedAtRoute voegt ook een Location header toe aan het antwoord. De Location header geeft de URI van het zojuist gemaakte boek op.

De web-API testen

  1. Bouw en voer de app uit.

  2. Navigeer naar https://localhost:<port>/api/books de parameterloze Get actiemethode van de controller te testen. Het volgende JSON-antwoord wordt weergegeven:

    [
      {
        "id":"5bfd996f7b8e48dc15ff215d",
        "bookName":"Design Patterns",
        "price":54.93,
        "category":"Computers",
        "author":"Ralph Johnson"
      },
      {
        "id":"5bfd996f7b8e48dc15ff215e",
        "bookName":"Clean Code",
        "price":43.15,
        "category":"Computers",
        "author":"Robert C. Martin"
      }
    ]
    
  3. Navigeer naar https://localhost:<port>/api/books/{id here} om de overbelaste Get actiemethode van de controller te testen. Het volgende JSON-antwoord wordt weergegeven:

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

Opties voor JSON-serialisatie configureren

Er zijn twee details die moeten worden gewijzigd over de JSON-antwoorden die worden geretourneerd in de sectie De web-API testen:

  • De standaard camelCase van de eigenschapsnamen moet worden gewijzigd zodat deze overeenkomt met de PascalCase van de eigenschapsnamen van het CLR-object.
  • De bookName eigenschap moet worden geretourneerd als Name.

Breng de volgende wijzigingen aan om aan de voorgaande vereisten te voldoen:

  1. Json.NET is verwijderd uit ASP.NET gedeeld framework. Voeg een pakketreferentie toe aan Microsoft.AspNetCore.Mvc.NewtonsoftJson.

  2. In Startup.ConfigureServices, schakel de volgende gemarkeerde code aan de AddControllers methodeaanroep:

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

    Met de voorgaande wijziging komen eigenschapsnamen in het geserialiseerde JSON-antwoord van de web-API overeen met de bijbehorende eigenschapsnamen in het CLR-objecttype. De Book eigenschap van de Author klasse serialiseert bijvoorbeeld als Author.

  3. Annotaeer Models/Book.csde BookName eigenschap met het volgende [JsonProperty] kenmerk:

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

    De waarde van het [JsonProperty] kenmerk Name vertegenwoordigt de eigenschapsnaam in de geseraliseerde JSON-reactie van de web-API.

  4. Voeg de volgende code toe bovenaan Models/Book.cs om de [JsonProperty] kenmerkreferentie op te lossen:

    using Newtonsoft.Json;
    
  5. Herhaal de stappen die zijn gedefinieerd in de sectie De web-API testen. Let op het verschil in JSON-eigenschapsnamen.

Verificatieondersteuning toevoegen aan een web-API

ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:

Duende IdentityServer is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende IdentityServer maakt de volgende beveiligingsfuncties mogelijk:

  • Verificatie als een service (AaaS)
  • Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
  • Toegangsbeheer voor API's
  • Federatie-gateway

Zie Overzicht van Duende IdentityServervoor meer informatie.

Raadpleeg Community OSS-verificatieopties voor ASP.NET Core voor meer informatie over andere authenticatieproviders.

Volgende stappen

Zie de volgende bronnen voor meer informatie over het bouwen van ASP.NET Core-web-API's: