IRONSOFTWAREHOME
AKTUALNOŚCI DLA PROGRAMISTÓW

Swashbuckle .NET Core (jak to działa dla programistów)

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Jacob Mellor
Updated: 21 kwietnia 2026

Swashbuckle to pakiet NuGet dla C# .NET Core, który pomaga w automatycznej dokumentacji RESTful Web API. W tym blogu przyjrzymy się pakietom NuGet Swashbuckle ASP.NET Core i IronPDF Installation Instructions, umożliwiającym nowoczesne tworzenie interfejsów API ASP.NET Core. Razem zapewniają one szereg funkcji, które można osiągnąć przy minimalnej ilości kodu.

Strony dokumentacji API sa wyswietlane przy uzyciu narzedzia Swagger UI, które korzysta z pliku swagger.json wygenerowanego z projektu Web API. Wygenerowany dokument JSON jest zgodny ze standardem Open API. Swashbuckle jest dostępne jako pakiet NuGet Swashbuckle.AspNetCore, który po zainstalowaniu i skonfigurowaniu automatycznie udostępni plik JSON Swagger. Narzędzie Swagger UI odczytuje plik Swagger JSON, wygenerowany na podstawie komentarzy XML zapisanych w interfejsach API. Dodatkowo można utworzyć plik dokumentacji XML, włączając tę opcję w pliku ustawień projektu. Komentarze XML są konwertowane na plik dokumentacji XML, na podstawie którego generowany jest plik Swagger JSON. Następnie oprogramowanie pośredniczące Swagger odczytuje plik JSON i udostępnia punkty końcowe Swagger JSON.

Wdrożenie w projekcie .NET Core Web API

Zacznijmy od projektu Web API:

dotnet new webapi -n SwashbuckleDemo
cd SwashbuckleDemo
dotnet build
dotnet add package Swashbuckle.AspNetCore --version 6.5.0
dotnet build
SHELL

W tym miejscu tworzymy projekt API sieci Web o nazwie "SwashbuckleDemo", a następnie instalujemy pakiet Swashbuckle w projekcie .NET Core Web API za pomocą konsoli menedżera pakietów.

Konfiguracja oprogramowania pośredniczącego Swagger

Skonfiguruj uslugi Swagger w pliku Startup.cs.

using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Other service configurations...

        // Register the Swagger generator
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });

            // Optionally, include XML comments for additional information
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Other app configurations...

        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable Swagger UI (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
    }
}

Dodaj kontroler dla interfejsów API listy zadań:

using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

// Example to define an entity class
public class Todo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}

// Example to define a DbContext class
public class TodoDb : DbContext
{
    public DbSet<Todo> Todos => Set<Todo>();
}

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "SwashbuckleDemo!");

app.MapGet("/todoitems", async (TodoDb db) =>
    await db.Todos.ToListAsync());

app.MapGet("/todoitems/complete", async (TodoDb db) =>
    await db.Todos.Where(t => t.IsComplete).ToListAsync());

app.MapGet("/todoitems/{id}", async (int id, TodoDb db) =>
    await db.Todos.FindAsync(id) is Todo todo
        ? Results.Ok(todo)
        : Results.NotFound());

app.MapPost("/todoitems", async (Todo todo, TodoDb db) =>
{
    db.Todos.Add(todo);
    await db.SaveChangesAsync();
    return Results.Created($"/todoitems/{todo.Id}", todo);
});

app.MapPut("/todoitems/{id}", async (int id, Todo inputTodo, TodoDb db) =>
{
    var todo = await db.Todos.FindAsync(id);
    if (todo is null) return Results.NotFound();
    todo.Name = inputTodo.Name;
    todo.IsComplete = inputTodo.IsComplete;
    await db.SaveChangesAsync();
    return Results.NoContent();
});

app.MapDelete("/todoitems/{id}", async (int id, TodoDb db) =>
{
    if (await db.Todos.FindAsync(id) is Todo todo)
    {
        db.Todos.Remove(todo);
        await db.SaveChangesAsync();
        return Results.Ok(todo);
    }

    return Results.NotFound();
});

app.Run();

Można również dodać kontroler, jak poniżej:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System;
using System.Linq;

namespace RestFullMinimalApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Retrieves WeatherForecast
        /// </summary>
        /// <remarks>Awesomeness!</remarks>
        /// <response code="200">Retrieved</response>
        /// <response code="404">Not found</response>
        /// <response code="500">Oops! Can't lookup your request right now</response>
        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }

    public class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public string Summary { get; set; }
    }
}

Powyższy kod jest dostępny na GitHubie – Swashbuckle Demo.

Swashbuckle oferuje następujące funkcje

Narzędzie Swagger UI

Swashbuckle ASP .NET Core (Jak to dziala dla developera): Rysunek 1 - Narzedzie Swagger UI

Interfejs użytkownika Swagger jest dostępny pod adresem "/swagger/index.html" z podstawowego adresu URL aplikacji Web API. Zawiera listę wszystkich interfejsów API REST z kodu. Generator Swagger odczytuje plik JSON i wypełnia interfejs użytkownika.

Swagger JSON

Swashbuckle.AspNetCore automatycznie generuje plik Swagger JSON, który zawiera informacje o strukturze API, w tym szczegóły takie jak punkty końcowe, typy żądań i odpowiedzi oraz inne. Ten plik JSON może być używany przez inne narzędzia i usługi obsługujące standard Swagger/OpenAPI.

Plik JSON Swagger jest dostępny pod adresem "/swagger/v1/swagger.json" w bazowym adresie URL aplikacji API.

Swashbuckle ASP .NET Core (Jak to dziala dla developera): Rysunek 2 - Plik JSON swagger.

Adnotacje do kodu

Programiści mogą używać komentarzy i atrybutów XML w swoich kontrolerach .NET Core, aby dostarczyć dodatkowych informacji do dokumentacji Swagger. Obejmuje to opisy, przykłady i inne metadane, które wzbogacają wygenerowaną dokumentację Swagger.

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    /// <summary>
    /// Retrieves WeatherForecast
    /// </summary>
    /// <remarks>Awesomeness!</remarks>
    /// <response code="200">Retrieved</response>
    /// <response code="404">Not found</response>
    /// <response code="500">Oops! Can't lookup your request right now</response>
    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

Opcje konfiguracji

Swashbuckle.AspNetCore oferuje różne opcje konfiguracyjne, które pozwalają dostosować sposób generowania dokumentacji Swagger. Programiści mogą kontrolować, które interfejsy API są dokumentówane, konfigurować konwencje nazewnictwa oraz dostosowywać inne ustawienia.

Oto niektóre z kluczowych opcji konfiguracyjnych oferowanych przez Swashbuckle.AspNetCore:

Opcje SwaggerGen

c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });

Ta linia określa wersję dokumentu Swagger i zawiera metadane, takie jak tytuł i wersja API.

c.IncludeXmlComments(xmlPath);

Ta opcja pozwala na dołączenie komentarzy XML z kodu w celu dostarczenia dodatkowych informacji w dokumentacji Swagger. Zmienna xmlPath powinna wskazywac lokalizacje pliku z komentarzami XML.

c.DescribeAllParametersInCamelCase();

Ta opcja konfiguruje generator Swagger tak, aby używał camelCase dla nazw parametrów.

c.OperationFilter<CustomOperationFilter>();

Można zarejestrować niestandardowe filtry operacji, aby modyfikować dokumentację Swagger dla określonych operacji. CustomOperationFilter to klasa, która implementuje IOperationFilter.

Opcje Swagger UI

c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");

Ta linia konfiguruje Swagger UI do wyświetlania dokumentacji. Pierwszym parametrem jest adres URL pliku JSON Swagger, a drugim parametrem jest przyjazna dla użytkownika nazwa wersji API.

c.RoutePrefix = "swagger";

Możesz ustawić prefiks trasy dla interfejsu użytkownika Swagger. W tym przykładzie interfejs Swagger UI będzie dostępny pod adresem /swagger.

c.DocExpansion(DocExpansion.None);

Ta opcja kontroluje sposób wyświetlania dokumentacji API w interfejsie Swagger UI. DocExpansion.None domyslnie zwija wszystkie operacje.

Opcje Swagger

c.SerializeAsV2 = true;

Ta opcja okresla, czy dokument Swagger jest serializowany w formacie wersji 2.0 (true) lub formacie 3.0 (false). Ustaw na true, jesli chcesz uzywac Swagger 2.0.

c.DisplayOperationId();

Ta opcja wyświetla identyfikator operacji w interfejsie użytkownika Swagger, co może być przydatne podczas debugowania i zrozumienia struktury API.

c.OAuthClientId("swagger-ui");

Jeśli Twoje API korzysta z uwierzytelniania OAuth, możesz skonfigurować identyfikator klienta OAuth dla Swagger UI.

To tylko kilka przykładów dostępnych opcji konfiguracyjnych. Biblioteka Swashbuckle.AspNetCore jest wysoce konfigurowalna i można dostosować dokumentację Swagger do konkretnych potrzeb, łącząc różne opcje i filtry. Aby uzyskać najbardziej aktualne i wyczerpujące informacje na temat dostępnych opcji, należy zawsze korzystać z oficjalnej dokumentacji lub funkcji IntelliSense w swoim środowisku programistycznym.

Przedstawiamy IronPDF

Przegląd produktów IronPDF to biblioteka PDF w języku C# ze strony internetowej Iron Software, która pomaga odczytywać i generować dokumenty PDF. Może z łatwością konwertować sformatowane dokumenty zawierające informacje o stylach do formatu PDF. IronPDF pozwala bez trudu generować pliki PDF z treści HTML. Może pobierać treści HTML z adresu URL, a następnie generować pliki PDF.

IronPDF to świetne narzędzie do konwersji stron internetowych, adresów URL i kodu HTML na pliki PDF, które idealnie odzwierciedlają źródło. Idealnie nadaje się do generowania plików PDF z treści internetowych, takich jak raporty i faktury, oraz bez wysiłku tworzy wersje PDF dowolnej strony internetowej.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

Instalacja

Zainstaluj IronPDF za pośrednictwem NuGet, korzystając z menedżera pakietów NuGet Package Manager Details lub konsoli menedżera pakietów Visual Studio Installation Guide.

W konsoli menedżera pakietów wpisz polecenie:

PM > Install-Package IronPdf

Korzystanie z programu Visual Studio

Swashbuckle ASP .NET Core (Jak to działa dla programisty): Rysunek 3 — Otwórz swój projekt w Visual Studio. Przejdź do menu "Narzędzia", wybierz "Menedżer pakietów NuGet", a następnie wybierz "Zarządzaj pakietami NuGet dla rozwiązania". W interfejsie Menedżera pakietów NuGet poszukaj pakietu "IronPDF" w zakładce Przeglądaj. Następnie wybierz i zainstaluj najnowszą wersję IronPDF.

Teraz zmodyfikujmy naszą aplikację, aby dodać funkcję pobierania treści stron internetowych jako plików PDF.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using IronPdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace RestFullMinimalApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Retrieves WeatherForecast
        /// </summary>
        /// <remarks>Awesomeness!</remarks>
        /// <response code="200">Retrieved</response>
        /// <response code="404">Not found</response>
        /// <response code="500">Oops! Can't lookup your request right now</response>
        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

        /// <summary>
        /// Retrieves WeatherForecast as Pdf
        /// </summary>
        /// <remarks>Awesomeness!</remarks>
        /// <response code="200">Retrieved</response>
        /// <response code="404">Not found</response>
        /// <response code="500">Oops! Can't lookup your request right now</response>
        [HttpGet("download", Name = "DownloadWeatherForecast")]
        public IActionResult GetWeatherPdf()
        {
            var results = Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            }).ToArray();

            var html = GetHtml(results);
            var renderer = new ChromePdfRenderer();
            var pdf = renderer.RenderHtmlAsPdf(html);
            var fileName = "WeatherReport.pdf";
            pdf.SaveAs(fileName);

            var stream = new FileStream(fileName, FileMode.Open);
            // Return the PDF file for download
            return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = fileName };
        }

        private static string GetHtml(WeatherForecast[] weatherForecasts)
        {
            string header = @"
<html>
<head><title>WeatherForecast</title></head>
<body>
<h1>WeatherForecast</h1>
";

            var footer = @"
</body>
</html>";

            var htmlContent = header;
            foreach (var weather in weatherForecasts)
            {
                htmlContent += $@"
    <h2>{weather.Date}</h2>
    <p>Summary: {weather.Summary}</p>
    <p>Temperature in Celsius: {weather.TemperatureC}</p>
    <p>Temperature in Fahrenheit: {weather.TemperatureF}</p>
";
            }
            htmlContent += footer;
            return htmlContent;
        }
    }

    public class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public string Summary { get; set; }
        
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

W tym przypadku wykorzystujemy dane pogodowe do wygenerowania ciągu znaków HTML, który następnie służy do utworzenia dokumentu PDF.

Treść HTML

Swashbuckle ASP .NET Core (Jak to dziala dla developera): Rysunek 4 - Zawartosc HTML dla prognozy pogody.

A raport w formacie PDF wygląda następująco:

Swashbuckle ASP .NET Core (Jak to dziala dla developera): Rysunek 5 - Plik wyjsciowy HTML do PDF: WeatherReport.pdf

Cały kod można znaleźć na GitHubie — Swashbuckle Demo Source Code.
Dokument zawiera niewielki znak wodny dotyczący licencji Trial, który można usunąć po uzyskaniu ważnej licencji.

Licencjonowanie (dostępna bezpłatna wersja próbna)

Aby powyższy kod działał, wymagany jest klucz licencyjny. Umiesc ten klucz w pliku appsettings.json.

{
    "IronPdf": {
        "LicenseKey": "your license key"
    }
}
JSON

Licencja Trial jest dostępna dla programistów po zarejestrowaniu się w IronPDF Trial Registration. Do uzyskania licencji Trial nie jest wymagana karta kredytowa. Zarejestruj się, podając swój adres e-mail, aby uzyskać bezpłatną wersję próbną.

Wnioski

Zrozumienie działania Swashbuckle i IronPDF pozwala na skuteczne zintegrowanie dokumentacji API oraz funkcji generowania plików PDF z aplikacjami ASP.NET Core. IronPDF oferuje również obszerną dokumentację dotyczącą pierwszych kroków, a także różne przykłady kodu do generowania plików PDF.

Dodatkowo możesz zapoznać się z powiązanymi produktami Iron Software, które pomogą Ci rozwinąć umiejętności programistyczne i sprostać współczesnym wymaganiom aplikacji.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta