Delen via


Aan de slag met NSwag en ASP.NET Core

Door Rico Suter en Dave Brock

Voorbeeldcode bekijken of downloaden (hoe download je)

NSwag biedt de volgende mogelijkheden:

  • De mogelijkheid om de Swagger UI en Swagger generator te gebruiken.
  • Flexibele mogelijkheden voor het genereren van code.

Met NSwag hebt u geen bestaande API nodig. U kunt API's van derden gebruiken die Swagger bevatten en een clientimplementatie genereren. Met NSwag kunt u de ontwikkelingscyclus versnellen en eenvoudig aanpassen aan API-wijzigingen.

Installatie van pakketten

Installeer NSwag om:

  • Genereer de Swagger-specificatie voor de geïmplementeerde web-API.
  • Serveer de Swagger-gebruikersinterface om door de web-API te bladeren en te testen.
  • Serveer de Redoc om API-documentatie toe te voegen voor de web-API.

Als u de NSwag ASP.NET Core middleware wilt gebruiken, installeert u het NSwag.AspNetCore NuGet-pakket. Dit pakket bevat de middleware voor het genereren en leveren van de Swagger-specificatie, Swagger UI (v2 en v3) en ReDoc UI. NSwag 14 ondersteunt alleen v3 van de Swagger UI-specificatie.

Gebruik een van de volgende methoden om het NSwag NuGet-pakket te installeren:

  • Vanuit het venster Package Manager Console:

    • Ga naar View>Andere Vensters>Package Manager Console

    • Navigeer naar de map waarin het NSwagSample.csproj bestand bestaat

    • Voer de volgende opdracht uit:

      Install-Package NSwag.AspNetCore
      
  • In het dialoogvenster NuGet-pakketten beheren:

    • Klik met de rechtermuisknop op het project in Solution Explorer>NuGet-pakketten beheren
    • Stel de pakketbron in op 'nuget.org'
    • Voer NSwag.AspNetCore in het zoekvak in
    • Selecteer het pakket 'NSwag.AspNetCore' op het tabblad Bladeren en klik op Installeren

Swagger middleware toevoegen en configureren

Voeg Swagger toe en configureer deze in uw ASP.NET Core-app door de volgende stappen uit te voeren:

  • Voeg de OpenApi-generator toe aan de servicesverzameling in Program.cs:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddOpenApiDocument();
  • Schakel de middleware in voor het leveren van de gegenereerde OpenApi-specificatie, de Swagger UI en de Redoc UI, ook in Program.cs:
if (app.Environment.IsDevelopment())
{
    // Add OpenAPI 3.0 document serving middleware
    // Available at: http://localhost:<port>/swagger/v1/swagger.json
    app.UseOpenApi();

    // Add web UIs to interact with the document
    // Available at: http://localhost:<port>/swagger
    app.UseSwaggerUi(); // UseSwaggerUI Protected by if (env.IsDevelopment())
}
  • Start de app. Navigeer naar:
    • http://localhost:<port>/swagger om de Swagger-gebruikersinterface weer te geven.
    • http://localhost:<port>/swagger/v1/swagger.json om de Swagger-specificatie weer te geven.

Code genereren

U kunt profiteren van de mogelijkheden voor het genereren van code van NSwag door een van de volgende opties te kiezen:

Code genereren met NSwagStudio

  • Installeer NSwagStudio door de instructies te volgen in de GitHub-opslagplaats van NSwagStudio. Op de releasepagina van NSwag kunt u een xcopy-versie downloaden die kan worden gestart zonder installatie- en beheerdersbevoegdheden.
  • Start NSwagStudio en voer de swagger.json bestands-URL in het tekstvak Swagger Specification URL in. Bijvoorbeeld: http://localhost:5232/swagger/v1/swagger.json.
  • Klik op de knop Lokaal kopiëren maken om een JSON-weergave van uw Swagger-specificatie te genereren.

NSwag Studio importeert de specificatie en exporteert een CSharp-client.

  • Klik in het gebied Uitvoer op het selectievakje CSharp Client . Afhankelijk van uw project kunt u ook TypeScript-client of CSharp-web-API-controller kiezen. Als u CSharp Web API Controller selecteert, wordt de service opnieuw opgebouwd met een servicespecificatie, die fungeert als omgekeerde generatie.
  • Klik op Uitvoer genereren om een volledige C#-client te produceren van het TodoApi.NSwag-project . Als u de gegenereerde clientcode wilt zien, klikt u op het tabblad CSharp Client :
namespace MyNamespace
{
    using System = global::System;

    [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.0.1.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")]
    public partial class TodoClient
    {
    #pragma warning disable 8618 // Set by constructor via BaseUrl property
        private string _baseUrl;
    #pragma warning restore 8618 // Set by constructor via BaseUrl property
        private System.Net.Http.HttpClient _httpClient;
        private static System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings, true);

        public TodoClient(System.Net.Http.HttpClient httpClient)
        {
            BaseUrl = "http://localhost:5232";
            _httpClient = httpClient;
        }

        private static Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
        {
            var settings = new Newtonsoft.Json.JsonSerializerSettings();
            UpdateJsonSerializerSettings(settings);
            return settings;
        }

        public string BaseUrl
        {
            get { return _baseUrl; }
            set
            {
                _baseUrl = value;
                if (!string.IsNullOrEmpty(_baseUrl) && !_baseUrl.EndsWith("/"))
                    _baseUrl += '/';
            }
        }
        // code omitted for brevity

Aanbeveling

De C#-clientcode wordt gegenereerd op basis van selecties op het tabblad Instellingen . Wijzig de instellingen om taken uit te voeren, zoals het wijzigen van de naam van de standaardnaamruimte en het genereren van synchrone methoden.

  • Kopieer de gegenereerde C#-code naar een bestand in het clientproject dat de API verbruikt.
  • Begin met het gebruik van de web-API:
var todoClient = new TodoClient(new HttpClient());

// Gets all to-dos from the API
var allTodos = await todoClient.GetAsync();

// Create a new TodoItem, and save it via the API.
await todoClient.CreateAsync(new TodoItem());

// Get a single to-do by ID
var foundTodo = await todoClient.GetByIdAsync(1);

API-documentatie aanpassen

OpenApi biedt opties voor het documenteren van het objectmodel om het verbruik van de web-API te vereenvoudigen.

API-informatie en -beschrijving

Werk Program.cs bij in AddOpenApiDocument om de documentgegevens van de Web API te configureren en meer informatie toe te voegen, zoals de auteur, licentie en beschrijving. Importeer eerst de NSwag naamruimte om de OpenApi klassen te gebruiken.

using NSwag;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenApiDocument(options => {
     options.PostProcess = document =>
     {
         document.Info = new OpenApiInfo
         {
             Version = "v1",
             Title = "ToDo API",
             Description = "An ASP.NET Core Web API for managing ToDo items",
             TermsOfService = "https://example.com/terms",
             Contact = new OpenApiContact
             {
                 Name = "Example Contact",
                 Url = "https://example.com/contact"
             },
             License = new OpenApiLicense
             {
                 Name = "Example License",
                 Url = "https://example.com/license"
             }
         };
     };
});

De Swagger-gebruikersinterface geeft de versiegegevens weer:

Swagger UI met versiegegevens.

XML-opmerkingen

Voer de volgende stappen uit om XML-opmerkingen in te schakelen:

  • Klik met de rechtermuisknop op het project in Solution Explorer en selecteer Edit <project_name>.csproj.
  • Voeg handmatig de gemarkeerde regels toe aan het .csproj-bestand:
<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

Het inschakelen van XML-opmerkingen biedt foutopsporingsinformatie voor niet-gedocumenteerde openbare typen en leden. Ongedocumenteerde typen en leden worden aangeduid door het waarschuwingsbericht. Het volgende bericht geeft bijvoorbeeld een schending van waarschuwingscode 1591 aan:

warning CS1591: Missing XML comment for publicly visible type or member 'TodoContext'

Als u waarschuwingen voor het hele project wilt onderdrukken, definieert u een door puntkomma's gescheiden lijst met waarschuwingscodes die in het projectbestand moeten worden genegeerd. Als u de waarschuwingscodes toevoegt aan $(NoWarn); worden de standaardwaarden van C# ook toegepast.

<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

Als u alleen waarschuwingen voor specifieke leden wilt onderdrukken, plaatst u de code in #pragma waarschuwing preprocessorrichtlijnen. Deze methode is handig voor code die niet beschikbaar moet worden gesteld via de API-documenten. In het volgende voorbeeld wordt waarschuwingscode CS1591 genegeerd voor de hele TodoContext klasse. Het handhaven van de waarschuwingscode wordt hersteld aan het einde van de class-definitie. Geef meerdere waarschuwingscodes op met een door komma's gescheiden lijst.

namespace NSwagSample.Models;

#pragma warning disable CS1591
public class TodoContext : DbContext
{
    public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }

    public DbSet<TodoItem> TodoItems => Set<TodoItem>();
}
#pragma warning restore CS1591

Gegevensaantekeningen

Markeer het model met kenmerken, gevonden in de System.ComponentModel.DataAnnotations naamruimte, om de Swagger UI-onderdelen te helpen aan te sturen.

Voeg het kenmerk [Required] toe aan de eigenschap Name van de klasse TodoItem:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace NSwagSample.Models;

public class TodoItem
{
    public long Id { get; set; }

    [Required]
    public string Name { get; set; } = null!;

    [DefaultValue(false)]
    public bool IsComplete { get; set; }
}

De aanwezigheid van dit kenmerk wijzigt het gedrag van de gebruikersinterface en wijzigt het onderliggende JSON-schema:

"TodoItem": {
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "format": "int64"
    },
    "name": {
      "type": "string",
      "minLength": 1
    },
    "isComplete": {
      "type": "boolean",
      "default": false
    }
  }
}

Naarmate het gebruik van gegevensaantekeningen in de web-API toeneemt, worden de helppagina's voor de gebruikersinterface en API meer beschrijvend en nuttiger.

Antwoordtypen beschrijven

Ontwikkelaars die een web-API gebruiken, houden zich het meest bezig met wat er wordt geretourneerd, met name antwoordtypen en foutcodes (indien niet standaard). De antwoordtypen en foutcodes worden aangeduid in de XML-opmerkingen en gegevensaantekeningen.

De Create-actie retourneert een HTTP 201-statuscode bij succes. Er wordt een HTTP 400-statuscode geretourneerd wanneer de geplaatste aanvraagbody is null. Zonder de juiste documentatie in de Swagger-gebruikersinterface mist de consument kennis van deze verwachte resultaten. Los dit probleem op door de gemarkeerde regels toe te voegen in het volgende voorbeeld:

/// <summary>
/// Creates a TodoItem.
/// </summary>
/// <param name="item"></param>
/// <returns>A newly created TodoItem</returns>
/// <remarks>
/// Sample request:
///
///     POST /Todo
///     {
///        "id": 1,
///        "name": "Item #1",
///        "isComplete": true
///     }
///
/// </remarks>
/// <response code="201">Returns the newly created item</response>
/// <response code="400">If the item is null</response>
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    await _context.SaveChangesAsync();

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

De Swagger-gebruikersinterface documentert nu duidelijk de verwachte HTTP-antwoordcodes (en de XML-opmerkingen worden ook weergegeven):

Swagger-gebruikersinterface met POST-antwoordklassebeschrijving 'Retourneert het zojuist gemaakte takenitem' en '400 - als het item null is' voor statuscode en reden onder Antwoordberichten.

Conventies kunnen worden gebruikt als alternatief voor het expliciet decoreren van afzonderlijke acties met [ProducesResponseType]. Zie Web-API-conventies gebruikenvoor meer informatie.

Redoc

Redoc is een alternatief voor de Swagger-gebruikersinterface. Het is vergelijkbaar omdat het ook een documentatiepagina voor de web-API biedt met behulp van de OpenAPI-specificatie. Het verschil is dat de Redoc-gebruikersinterface meer gericht is op de documentatie en geen interactieve gebruikersinterface biedt om de API te testen.

Als u Redoc wilt inschakelen, voegt u de middleware toe aan Program.cs:

if (app.Environment.IsDevelopment())
{
    // Add OpenAPI 3.0 document serving middleware
    // Available at: http://localhost:<port>/swagger/v1/swagger.json
    app.UseOpenApi();

    // Add web UIs to interact with the document
    // Available at: http://localhost:<port>/swagger
    app.UseSwaggerUi(); // UseSwaggerUI is called only in Development.
    
    // Add ReDoc UI to interact with the document
    // Available at: http://localhost:<port>/redoc
    app.UseReDoc(options =>
    {
        options.Path = "/redoc";
    });
}

Voer de toepassing uit en navigeer naar http://localhost:<port>/redoc om de Redoc-gebruikersinterface te bekijken.

Documentatie voor redoc voor de voorbeeld-API.

Door Rico Suter en Dave Brock

Voorbeeldcode bekijken of downloaden (hoe download je)

NSwag biedt de volgende mogelijkheden:

  • De mogelijkheid om de Swagger UI en Swagger generator te gebruiken.
  • Flexibele mogelijkheden voor het genereren van code.

Met NSwag hebt u geen bestaande API nodig. U kunt API's van derden gebruiken die Swagger bevatten en een clientimplementatie genereren. Met NSwag kunt u de ontwikkelingscyclus versnellen en eenvoudig aanpassen aan API-wijzigingen.

De NSwag-middleware registreren

Registreer de NSwag-middleware om te:

  • Genereer de Swagger-specificatie voor de geïmplementeerde web-API.
  • Serveer de Swagger-gebruikersinterface om door de web-API te bladeren en te testen.

Als u de NSwag ASP.NET Core middleware wilt gebruiken, installeert u het NSwag.AspNetCore NuGet-pakket. Dit pakket bevat de middleware voor het genereren en leveren van de Swagger-specificatie, Swagger UI (v2 en v3) en ReDoc UI.

Gebruik een van de volgende methoden om het NSwag NuGet-pakket te installeren:

  • Vanuit het venster Package Manager Console:

    • Ga naar View>Andere Vensters>Package Manager Console

    • Navigeer naar de map waarin het TodoApi.csproj bestand bestaat

    • Voer de volgende opdracht uit:

      Install-Package NSwag.AspNetCore
      
  • In het dialoogvenster NuGet-pakketten beheren:

    • Klik met de rechtermuisknop op het project in Solution Explorer>NuGet-pakketten beheren
    • Stel de pakketbron in op 'nuget.org'
    • Voer NSwag.AspNetCore in het zoekvak in
    • Selecteer het pakket 'NSwag.AspNetCore' op het tabblad Bladeren en klik op Installeren

Swagger middleware toevoegen en configureren

Voeg Swagger toe en configureer deze in uw ASP.NET Core-app door de volgende stappen uit te voeren:

  • Registreer in de Startup.ConfigureServices methode de vereiste Swagger-services:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TodoContext>(opt =>
        opt.UseInMemoryDatabase("TodoList"));
    services.AddMvc();

    // Register the Swagger services
    services.AddSwaggerDocument();
}
  • Schakel in de Startup.Configure methode de middleware in voor het leveren van de gegenereerde Swagger-specificatie en de Swagger-gebruikersinterface:
public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();

    // Register the Swagger generator and the Swagger UI middlewares
    app.UseOpenApi();
    app.UseOpenApi();
    if (env.IsDevelopment())
    {
        app.UseSwaggerUi3();
    }
    app.UseMvc();
}
  • Start de app. Navigeer naar:
    • http://localhost:<port>/swagger om de Swagger-gebruikersinterface weer te geven.
    • http://localhost:<port>/swagger/v1/swagger.json om de Swagger-specificatie weer te geven.

Code genereren

U kunt profiteren van de mogelijkheden voor het genereren van code van NSwag door een van de volgende opties te kiezen:

Code genereren met NSwagStudio

  • Installeer NSwagStudio door de instructies te volgen in de GitHub-opslagplaats van NSwagStudio. Op de NSwag-releasepagina kunt u een xcopy-versie downloaden die kan worden gestart zonder installatie- en beheerdersbevoegdheden.

  • Start NSwagStudio en voer de swagger.json bestands-URL in het tekstvak Swagger Specification URL in. Bijvoorbeeld: http://localhost:44354/swagger/v1/swagger.json.

  • Klik op de knop Lokaal kopiëren maken om een JSON-weergave van uw Swagger-specificatie te genereren.

    Lokale kopie van Swagger-specificatie maken

  • Klik in het gebied Uitvoer op het selectievakje CSharp Client . Afhankelijk van uw project kunt u ook TypeScript-client of CSharp-web-API-controller kiezen. Als u CSharp Web API Controller selecteert, wordt de service opnieuw opgebouwd met een servicespecificatie, die fungeert als omgekeerde generatie.

  • Klik op Uitvoer genereren om een volledige C#-client te produceren van het TodoApi.NSwag-project . Als u de gegenereerde clientcode wilt zien, klikt u op het tabblad CSharp Client :

//----------------------
// <auto-generated>
//     Generated using the NSwag toolchain v12.0.9.0 (NJsonSchema v9.13.10.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------

namespace MyNamespace
{
    #pragma warning disable

    [System.CodeDom.Compiler.GeneratedCode("NSwag", "12.0.9.0 (NJsonSchema v9.13.10.0 (Newtonsoft.Json v11.0.0.0))")]
    public partial class TodoClient
    {
        private string _baseUrl = "https://localhost:44354";
        private System.Net.Http.HttpClient _httpClient;
        private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;

        public TodoClient(System.Net.Http.HttpClient httpClient)
        {
            _httpClient = httpClient;
            _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(() =>
            {
                var settings = new Newtonsoft.Json.JsonSerializerSettings();
                UpdateJsonSerializerSettings(settings);
                return settings;
            });
        }

        public string BaseUrl
        {
            get { return _baseUrl; }
            set { _baseUrl = value; }
        }

        // code omitted for brevity

Aanbeveling

De C#-clientcode wordt gegenereerd op basis van selecties op het tabblad Instellingen . Wijzig de instellingen om taken uit te voeren, zoals het wijzigen van de naam van de standaardnaamruimte en het genereren van synchrone methoden.

  • Kopieer de gegenereerde C#-code naar een bestand in het clientproject dat de API verbruikt.
  • Begin met het gebruik van de web-API:
 var todoClient = new TodoClient();

// Gets all to-dos from the API
 var allTodos = await todoClient.GetAllAsync();

 // Create a new TodoItem, and save it via the API.
var createdTodo = await todoClient.CreateAsync(new TodoItem());

// Get a single to-do by ID
var foundTodo = await todoClient.GetByIdAsync(1);

API-documentatie aanpassen

Swagger biedt opties voor het documenteren van het objectmodel om het verbruik van de web-API te vereenvoudigen.

API-informatie en -beschrijving

In de Startup.ConfigureServices methode voegt een configuratieactie die is doorgegeven aan de AddSwaggerDocument methode informatie toe, zoals de auteur, licentie en beschrijving:

services.AddSwaggerDocument(config =>
{
    config.PostProcess = document =>
    {
        document.Info.Version = "v1";
        document.Info.Title = "ToDo API";
        document.Info.Description = "A simple ASP.NET Core web API";
        document.Info.TermsOfService = "None";
        document.Info.Contact = new NSwag.OpenApiContact
        {
            Name = "Shayne Boyer",
            Email = string.Empty,
            Url = "https://twitter.com/spboyer"
        };
        document.Info.License = new NSwag.OpenApiLicense
        {
            Name = "Use under LICX",
            Url = "https://example.com/license"
        };
    };
});

De Swagger-gebruikersinterface geeft de versiegegevens weer:

Swagger UI met versiegegevens

XML-opmerkingen

Voer de volgende stappen uit om XML-opmerkingen in te schakelen:

  • Klik met de rechtermuisknop op het project in Solution Explorer en selecteer Edit <project_name>.csproj.
  • Voeg handmatig de gemarkeerde regels toe aan het .csproj-bestand:
<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

Gegevensaantekeningen

Omdat NSwag Weerspiegeling gebruikt en het aanbevolen retourtype voor web-API-acties ActionResult<T> is, kan het alleen het retourtype afleiden dat is gedefinieerd door T. U kunt andere mogelijke retourtypen niet automatisch afleiden.

Bekijk het volgende voorbeeld:

[HttpPost]
public ActionResult<TodoItem> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    _context.SaveChanges();

    return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
}

De voorgaande actie geeft ActionResult<T> terug. Binnen de actie wordt het geretourneerd CreatedAtRoute. Omdat de controller het [ApiController] kenmerk heeft, is er ook een BadRequest antwoord mogelijk. Zie Automatische HTTP 400-antwoordenvoor meer informatie. Gebruik gegevensaantekeningen om clients te laten weten welke HTTP-statuscodes deze actie moet retourneren. Markeer de actie met de volgende kenmerken:

[ProducesResponseType(StatusCodes.Status201Created)]     // Created
[ProducesResponseType(StatusCodes.Status400BadRequest)]  // BadRequest

In ASP.NET Core 2.2 of hoger kunt u conventies gebruiken in plaats van expliciet afzonderlijke acties te decoreren met [ProducesResponseType]. Zie Web-API-conventies gebruikenvoor meer informatie.

De Swagger-generator kan deze actie nu nauwkeurig beschrijven en gegenereerde clients weten wat ze ontvangen bij het aanroepen van het eindpunt. Als aanbeveling markeert u alle acties met deze kenmerken.

Zie RFC 9110: HTTP-semantiek (sectie 9.3) voor richtlijnen over welke HTTP-antwoorden uw API-acties moeten retourneren. Methodedefinities).