Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Note
Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 10 de cet article.
Warning
Cette version d'ASP.NET Core n'est plus prise en charge. Pour plus d’informations, consultez la stratégie de prise en charge de .NET et .NET Core. Pour la version actuelle, consultez la version .NET 9 de cet article.
Cet article fournit une vue d’ensemble des principes fondamentaux de la génération d’applications ASP.NET Core, notamment l’injection de dépendances, la configuration, les middlewares, etc.
Pour des conseils sur les principes fondamentaux sur Blazor, qui complètent ou remplacent les conseils de cet article, voir les principes fondamentaux d'ASP.NET CoreBlazor.
Program.cs
Les applications ASP.NET Core créées avec les modèles web contiennent le code de démarrage de l’application dans le fichier Program.cs. Le fichier Program.cs se trouve à l’emplacement où :
- Les services nécessaires à l’application sont configurés.
- Le pipeline de gestion des demandes de l’application est défini comme une série de composants middleware.
Le code de démarrage d’application suivant prend en charge plusieurs types d’applications :
using WebAll.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.UseAntiforgery();
app.Run();
Injection de dépendances (services)
ASP.NET Core est doté de fonctionnalités intégrées d'injection de dépendances (DI) qui rendent les services configurés disponibles dans l'ensemble d'une application. Les services sont ajoutés au conteneur d’adresses di avec WebApplicationBuilder.Services, builder.Services dans le code précédent. Lorsque le WebApplicationBuilder est instancié, de nombreux services fournis par le framework sont ajoutés automatiquement.
builder est un WebApplicationBuilder dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
Dans le code précédent, CreateBuilder ajoute la configuration, le journal et de nombreux autres services au conteneur DI. L’infrastructure d’interface de base de données fournit une instance d’un service demandé au moment de l’exécution.
Le code suivant ajoute un composant personnalisé DbContext et les composants Blazor au conteneur DI :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext")
?? throw new InvalidOperationException("Connection string not found.")));
builder.Services.AddQuickGridEntityFrameworkAdapter();
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
Dans Blazor Web Apps, les services sont souvent résolus à partir de DI au moment de l'exécution en utilisant la directive @inject dans un composant Razor, comme illustré dans l'exemple suivant :
@page "/movies"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Components.QuickGrid
@using BlazorWebAppMovies.Models
@using BlazorWebAppMovies.Data
@implements IAsyncDisposable
@inject IDbContextFactory<BlazorWebAppMovies.Data.BlazorWebAppMoviesContext> DbFactory
<PageTitle>Index</PageTitle>
<h1>Index</h1>
<div>
<input type="search" @bind="titleFilter" @bind:event="oninput" />
</div>
<p>
<a href="movies/create">Create New</a>
</p>
<QuickGrid Class="table" Items="FilteredMovies" Pagination="pagination">
<PropertyColumn Property="movie => movie.Title" Sortable="true" />
<PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
<PropertyColumn Property="movie => movie.Genre" />
<PropertyColumn Property="movie => movie.Price" />
<PropertyColumn Property="movie => movie.Rating" />
<TemplateColumn Context="movie">
<a href="@($"movies/edit?id={movie.Id}")">Edit</a> |
<a href="@($"movies/details?id={movie.Id}")">Details</a> |
<a href="@($"movies/delete?id={movie.Id}")">Delete</a>
</TemplateColumn>
</QuickGrid>
<Paginator State="pagination" />
@code {
private BlazorWebAppMoviesContext context = default!;
private PaginationState pagination = new PaginationState { ItemsPerPage = 10 };
private string titleFilter = string.Empty;
private IQueryable<Movie> FilteredMovies =>
context.Movie.Where(m => m.Title!.Contains(titleFilter));
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
public async ValueTask DisposeAsync() => await context.DisposeAsync();
}
Dans le code précédent :
- La directive
@injectest utilisée. - Le service est résolu dans la méthode
OnInitializedet affecté à la variablecontext. - Le service
contextcrée la liste desFilteredMovie.
Une autre façon de résoudre un service à partir de DI consiste à utiliser l’injection de constructeur. Le code des pages suivantes Razor utilise l'injection de constructeur pour résoudre le contexte de la base de données et un enregistreur à partir de DI :
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}
Dans le code précédent, le constructeur IndexModel prend un paramètre de type RazorPagesMovieContext, qui est résolu au moment de l’exécution dans la variable _context. L’objet de contexte est utilisé pour créer une liste de films dans la méthode OnGetAsync.
Pour plus d'informations, consultez les sections Injection de dépendances dans ASP.NET CoreBlazor et Injection de dépendances dans ASP.NET Core.
Middleware
Le pipeline de traitement des requêtes est composé comme une série de composants d’intergiciel (middleware). Chaque composant effectue des opérations sur un HttpContext, puis appelle le middleware suivant dans le pipeline, ou met fin à la requête.
Par convention, un composant de middleware est ajouté au pipeline via l’appel d’une méthode d’extension Use{Feature}. L’utilisation de méthodes nommées Use{Feature} pour ajouter un intergiciel à une application est illustrée dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext")
?? throw new InvalidOperationException("Connection string not found.")));
builder.Services.AddQuickGridEntityFrameworkAdapter();
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseHsts();
app.UseMigrationsEndPoint();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
Pour plus d’informations, consultez Intergiciel (middleware) ASP.NET Core.
Host
Au démarrage, une application ASP.NET Core génère un hôte. L’hôte encapsule toutes les ressources de l’application, par exemple :
- Une implémentation serveur HTTP
- Composants d’intergiciel
- Logging
- Services d’injection de dépendances
- Configuration
Il existe trois types d’hôtes capables d’exécuter une application ASP.NET Core :
- ASP.NET Core WebApplication, également appelé Hôte minimal
- Hôte générique .NET combiné au ConfigureWebHostDefaults d'ASP.NET Core
- ASP.NET Core WebHost
Les types ASP.NET Core WebApplication et WebApplicationBuilder sont recommandés et sont utilisés dans tous les modèles ASP.NET Core.
WebApplication se comporte de la même façon que l’hôte générique .NET et expose la plupart des mêmes interfaces, mais nécessite moins de rappels à configurer. L’hôte web ASP.NET Core WebHost est disponible uniquement à des fins de compatibilité descendante.
L’exemple suivant instancie un WebApplication et l’affecte à une variable nommée app:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext")
?? throw new InvalidOperationException("Connection string not found.")));
builder.Services.AddQuickGridEntityFrameworkAdapter();
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
La méthode WebApplicationBuilder.Build configure un hôte avec un ensemble d’options par défaut, telles que :
- Utilisez Kestrel en tant que serveur web, et activez l’intégration d’IIS.
- Chargez la configuration à partir de
appsettings.json, des variables d’environnement, des arguments de ligne de commande et d’autres sources de configuration. - Envoyez la sortie de journalisation aux fournisseurs Console et Debug.
Scénarios non web
L’hôte générique permet à d’autres types d’applications d’utiliser des extensions de framework multi-coupe, telles que la journalisation, l’injection de dépendances (DI), la configuration et la gestion de la durée de vie des applications. Pour plus d’informations, consultez Hôte générique .NET dans ASP.NET Core et Tâches en arrière-plan avec des services hébergés dans ASP.NET Core.
Servers
Une application ASP.NET Core utilise une implémentation de serveur HTTP pour écouter les requêtes HTTP. Le serveur expose les requêtes à l’application sous la forme d’un ensemble de fonctionnalités de requête composées en un HttpContext.
ASP.NET Core fournit les implémentations de serveur suivantes :
- Kestrel est un serveur web multiplateforme. Kestrel est souvent exécuté dans une configuration de proxy inverse à l’aide d’IIS. Dans ASP.NET Core 2.0 ou les versions ultérieures, Kestrel peut être exécuté en tant que serveur de périphérie public exposé directement à Internet.
- Le serveur HTTP IIS est un serveur pour Windows qui utilise IIS. Avec ce serveur, l’application ASP.NET Core et IIS s’exécutent dans le même processus.
- HTTP.sys est un serveur pour Windows qui n’est pas utilisé avec IIS.
Pour plus d’informations, consultez Implémentations du serveur web dans ASP.NET Core.
Configuration
ASP.NET Core fournit une infrastructure de configuration qui obtient des paramètres en tant que paires nom-valeur à partir d’un ensemble ordonné de fournisseurs de configuration. Des fournisseurs de configuration intégrés sont disponibles pour diverses sources, par exemple les fichiers .json, les fichiers .xml, les variables d’environnement et les arguments de ligne de commande. Écrivez des fournisseurs de configuration personnalisés pour prendre en charge d’autres sources.
Par défaut, les applications ASP.NET Core sont configurées pour lire à partir des variables d'environnement, de la ligne de commande et de bien plus encore. Quand la configuration de l’application est chargée, les valeurs des variables d’environnement remplacent les valeurs de appsettings.json.
Pour gérer les données de configuration confidentielles telles que les mots de passe dans l’environnement de développement, .NET fournit le Gestionnaire de secrets. Pour les secrets de production, nous vous recommandons Azure Key Vault.
Pour plus d’informations, consultez Configuration dans ASP.NET Core.
Environments
Les environnements d’exécution, par exemple Development, Staging et Production, sont disponibles dans ASP.NET Core. Spécifiez l’environnement d’exécution d’une application en définissant la variable d’environnement ASPNETCORE_ENVIRONMENT. ASP.NET Core lit la variable d’environnement au démarrage de l’application et stocke la valeur dans une implémentation IWebHostEnvironment. Cette implémentation est disponible n’importe où dans une application via l’injection de dépendances.
L’exemple suivant configure le gestionnaire d’exceptions et le middleware (intergiciel) HSTS (HTTP Strict Transport Security Protocol) quand l’environnement d’exécution n’est pas l’environnement Development :
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseHsts();
app.UseMigrationsEndPoint();
}
Pour plus d’informations, consultez ASP.NET environnements d’exécution Core.
Logging
ASP.NET Core prend en charge une API de journalisation qui fonctionne avec un large éventail de fournisseurs de journalisation intégrés et tiers. Les fournisseurs disponibles sont les suivants :
- Console
- Debug
- Suivi des événements sur Windows
- Journal des événements Windows
- TraceSource
- Azure App Service
- Azure Application Insights
Pour créer des journaux, résolvez un service ILogger<TCategoryName> à partir de l’injection de dépendances et des méthodes de journalisation des appels telles que LogInformation. L’exemple suivant montre comment obtenir et utiliser un enregistreur d’événements dans un fichier .razor pour une page d’un Blazor Web App. Un objet logger et un fournisseur de console pour celui-ci sont automatiquement stockés dans le conteneur DI lorsque la méthode CreateBuilder est appelée dans Program.cs.
@page "/weather"
@attribute [StreamRendering]
@inject ILogger<Weather> Logger
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data and logging.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th aria-label="Temperature in Celsius">Temp. (C)</th>
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
// Simulate asynchronous loading to demonstrate streaming rendering
await Task.Delay(500);
Logger.LogInformation("This is an information log message.");
Logger.LogWarning("This is a warning log message.");
Logger.LogError("This is an error log message.");
var startDate = DateOnly.FromDateTime(DateTime.Now);
var summaries = new[] { "Freezing", "Bracing", "Chilly",
"Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
}).ToArray();
}
private class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}
Pour plus d’informations, consultez Journalisation dans .NET et ASP.NET Core.
Routing
Le routage dans ASP.NET Core est un mécanisme qui mappe les requêtes entrantes à des points de terminaison spécifiques dans une application. Il vous permet de définir des modèles d’URL qui correspondent à différents composants, tels que des composants Blazor, des pages Razor, des actions de contrôleur MVC ou des intergiciels.
La méthode UseRouting(IApplicationBuilder) ajoute un intergiciel de routage au pipeline de requête. Ce middleware traite les informations de routage et détermine le point de terminaison approprié pour chaque requête. Vous n’avez pas besoin d’appeler explicitement UseRouting, sauf si vous souhaitez modifier l’ordre dans lequel le middleware est traité.
Pour plus d’informations, consultez Routage dans ASP.NET Core et ASP.NET Core Blazor routage et navigation.
Gestion des erreurs
ASP.NET Core offre des fonctionnalités intégrées pour gérer des erreurs, telles que :
- Une page d’exceptions du développeur
- Pages d’erreur personnalisées
- Pages de codes d’état statique
- Gestion des exceptions de démarrage
Pour plus d’informations, consultez Gérer les erreurs dans ASP.NET Core.
Effectuer des requêtes HTTP
Une implémentation de IHttpClientFactory est disponible pour la création d’instances HttpClient. La fabrique :
- Fournit un emplacement central pour le nommage et la configuration d’instance de
HttpClientlogiques. Par exemple, inscrivez et configurez un client github pour accéder à GitHub. Inscrivez et configurez un client par défaut à d’autres fins. - Prend en charge l’inscription et le chaînage de plusieurs gestionnaires de délégation pour créer un pipeline de middlewares pour les requêtes sortantes. Ce modèle est similaire au pipeline de middleware entrant d’ASP.NET Core. Le modèle fournit un mécanisme permettant de gérer les problèmes transversaux pour les requêtes HTTP, notamment la mise en cache, la gestion des erreurs, la sérialisation et la journalisation.
- S’intègre à Polly, une bibliothèque tierce populaire pour la gestion des erreurs temporaires.
- Gère le regroupement et la durée de vie des instances de HttpClientHandler sous-jacentes pour éviter les problèmes DNS courants qui se produisent durant la gestion manuelle des durées de vie de
HttpClient. - Ajoute une expérience de journalisation configurable (via ILogger) pour toutes les requêtes envoyées via les clients créés par la fabrique.
Pour plus d’informations, consultez Effectuer des requêtes HTTP en utilisant IHttpClientFactory dans ASP.NET Core.
Racine du contenu
La racine du contenu est le chemin de base pour :
- Exécutable hébergeant l’application (.exe).
- Assemblys compilés qui composent l’application (.dll).
- Fichiers de contenu utilisés par l’application, par exemple :
- Fichiers Razor (
.cshtml,.razor) - Fichiers config (
.json,.xml) - Fichiers de données (
.db)
- Fichiers Razor (
- La racine Web, généralement le
wwwrootrépertoire.
Durant le développement, la racine du contenu correspond par défaut au répertoire racine du projet. Ce répertoire est également le chemin d’accès de base pour les fichiers de contenu de l’application et la racine web. Spécifiez une autre racine de contenu en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la racine du contenu.
La racine Web
La racine web est le chemin de base des fichiers de ressources publics statiques, par exemple :
- Feuilles de style (
.css) - JavaScript (
.js) - Images (
.png,.jpg)
Par défaut, les fichiers statiques sont traités uniquement à partir du répertoire racine web et de ses sous-répertoires. Le chemin racine web est défini par défaut sur {CONTENT ROOT}/wwwroot, où l’espace réservé {CONTENT ROOT} est la racine de contenu. Spécifiez une autre racine web en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la Racine Web.
Empêchez la publication de fichiers dans wwwroot en utilisant l’élément de projet <Content> dans le fichier projet. L’exemple suivant empêche la publication de contenu dans wwwroot/local et de ses sous-répertoires :
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
Dans les fichiers Razor.cshtml, ~/ pointe vers la racine web. Un chemin d’accès commençant ~/ par est appelé chemin d’accès virtuel.
Pour plus d’informations, consultez Fichiers statiques dans ASP.NET Core.
Comment télécharger un exemple
La plupart des articles et tutoriels contiennent des liens vers des exemples de code.
- Téléchargez le fichier zip du dépôt ASP.NET.
- Décompressez le fichier
AspNetCore.Docs-main.zip. - Pour accéder à l’exemple d’application d’un article dans le référentiel décompressé, utilisez l’URL du lien de l’exemple de cet article. En règle générale, l’exemple de lien d’un article apparaît en haut de l’article avec le texte de lien Afficher ou télécharger l’exemple de code.
Directives de préprocesseur dans l’exemple de code
Pour montrer plusieurs scénarios, les exemples d’applications utilisent les directives pré-processeur #define et #if-#else/#elif-#endif pour compiler et exécuter différentes sections de l’exemple de code de manière sélective. Pour ces exemples qui utilisent cette approche, définissez la directive #define en haut des fichiers C# pour définir le symbole associé au scénario que vous souhaitez exécuter. Certains exemples exigent que vous définissiez le symbole en haut de plusieurs fichiers afin d’exécuter un scénario.
Par exemple, la liste des symboles #define suivante indique que les quatre scénarios sont disponibles (un scénario par symbole). La configuration actuelle de l’exemple exécute le scénario TemplateCode :
#define TemplateCode // or LogFromMain or ExpandDefault or FilterInCode
Pour que l’exemple exécute le scénario ExpandDefault, définissez le symbole ExpandDefault et laissez les symboles restants commentés :
#define ExpandDefault // TemplateCode or LogFromMain or FilterInCode
Pour plus d’informations sur l’utilisation des directives de préprocesseur C# pour compiler de manière sélective des sections de code, consultez #define (référence C#) et #if (référence C#).
Régions dans l’exemple de code
Certains exemples d’applications contiennent des sections de code entourées de directives #region et #endregion C#. Le système de génération de documentation injecte ces régions dans les rubriques de documentation rendues.
Les noms de région contiennent généralement le mot « extrait de code ». L’exemple suivant montre une région nommée snippet_WebHostDefaults:
#region snippet_WebHostDefaults
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
#endregion
L’extrait de code C# précédent est référencé dans le fichier markdown de la rubrique avec la ligne suivante :
[!code-csharp[](sample/SampleApp/Program.cs?name=snippet_WebHostDefaults)]
Vous pouvez ignorer ou supprimer en toute sécurité les directives #region et #endregion qui entourent le code. Ne modifiez pas le code dans ces directives si vous envisagez d’exécuter les exemples de scénarios décrits dans la rubrique.
Pour plus d’informations, consultez Contribuer à la documentation ASP.NET : extraits de code.
Ressources supplémentaires
Cet article fournit une vue d’ensemble des principes fondamentaux de la génération d’applications ASP.NET Core, notamment l’injection de dépendances, la configuration, les middlewares, etc.
Program.cs
Les applications ASP.NET Core créées avec les modèles web contiennent le code de démarrage de l’application dans le fichier Program.cs. Le fichier Program.cs se trouve à l’emplacement où :
- Les services nécessaires à l’application sont configurés.
- Le pipeline de gestion des demandes de l’application est défini comme une série de composants middleware.
Le code de démarrage d’application suivant prend en charge les éléments suivants :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Injection de dépendances (services)
ASP.NET Core inclut l’injection de dépendances (DI) qui rend les services configurés disponibles dans l’ensemble d’une application. Les services sont ajoutés au conteneur d’adresses di avec WebApplicationBuilder.Services, builder.Services dans le code précédent. Lorsque WebApplicationBuilder est instancié, de nombreux services fournis par le framework sont ajoutés.
builder est un WebApplicationBuilder dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
Dans le code en surbrillance précédent, builder permet l’ajout de la configuration, de la journalisation et de nombreux autres services au conteneur d’injection de dépendances.
Le code suivant ajoute des pages Razor, des contrôleurs MVC avec vues et un DbContext personnalisé au conteneur d’injection de dépendances :
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RPMovieContext")));
var app = builder.Build();
Les services sont généralement résolus à partir de l’interface d’injection de dépendances à l’aide de l’injection de constructeurs. Le framework d’injection de dépendances fournit une instance de ce service au moment de l’exécution.
Le code suivant utilise l’injection de constructeurs pour résoudre le contexte de base de données et le journaliseur à partir de l’injection de dépendances :
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}
Middleware
Le pipeline de traitement des requêtes est composé comme une série de composants d’intergiciel (middleware). Chaque composant effectue des opérations sur un HttpContext, puis appelle le middleware suivant dans le pipeline, ou met fin à la requête.
Par convention, un composant de middleware est ajouté au pipeline via l’appel d’une méthode d’extension Use{Feature}. Le middleware ajouté à l’application est mis en évidence dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez Intergiciel (middleware) ASP.NET Core.
Host
Au démarrage, une application ASP.NET Core génère un hôte. L’hôte encapsule toutes les ressources de l’application, par exemple :
- Une implémentation serveur HTTP
- Composants d’intergiciel
- Logging
- Services d’injection de dépendances
- Configuration
Il existe trois types d’hôtes capables d’exécuter une application ASP.NET Core :
- ASP.NET Core WebApplication, également appelé Hôte minimal
- Hôte générique .NET combiné au ConfigureWebHostDefaults d'ASP.NET Core
- ASP.NET Core WebHost
Les types ASP.NET Core WebApplication et WebApplicationBuilder sont recommandés et utilisés dans tous les modèles ASP.NET Core.
WebApplication se comporte de la même manière que l’hôte générique .NET et expose la plupart des mêmes interfaces, mais nécessite moins de rappels à configurer. L’hôte web ASP.NET Core WebHost est disponible uniquement à des fins de compatibilité descendante.
L'exemple suivant instancie un objet WebApplication :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
La méthode WebApplicationBuilder.Build configure un hôte avec un ensemble d’options par défaut, telles que :
- Utilisez Kestrel en tant que serveur web, et activez l’intégration d’IIS.
- Chargez la configuration à partir de
appsettings.json, des variables d’environnement, des arguments de ligne de commande et d’autres sources de configuration. - Envoyez la sortie de journalisation aux fournisseurs Console et Debug.
Scénarios non web
L’hôte générique permet à d’autres types d’application d’utiliser des extensions de framework composites, par exemple la journalisation, l’injection de dépendance, la configuration et la gestion de la durée de vie de l’application. Pour plus d’informations, consultez Hôte générique .NET dans ASP.NET Core et Tâches en arrière-plan avec des services hébergés dans ASP.NET Core.
Servers
Une application ASP.NET Core utilise une implémentation de serveur HTTP pour écouter les requêtes HTTP. Le serveur expose les requêtes à l’application sous la forme d’un ensemble de fonctionnalités de requête composées en un HttpContext.
ASP.NET Core fournit les implémentations de serveur suivantes :
- Kestrel est un serveur web multiplateforme. Kestrel est souvent exécuté dans une configuration de proxy inverse à l’aide d’IIS. Dans ASP.NET Core 2.0 ou les versions ultérieures, Kestrel peut être exécuté en tant que serveur de périphérie public exposé directement à Internet.
- Le serveur HTTP IIS est un serveur pour Windows qui utilise IIS. Avec ce serveur, l’application ASP.NET Core et IIS s’exécutent dans le même processus.
- HTTP.sys est un serveur pour Windows qui n’est pas utilisé avec IIS.
Pour plus d’informations, consultez Implémentations du serveur web dans ASP.NET Core.
Configuration
ASP.NET Core fournit une infrastructure de configuration qui obtient des paramètres en tant que paires nom-valeur à partir d’un ensemble ordonné de fournisseurs de configuration. Des fournisseurs de configuration intégrés sont disponibles pour diverses sources, par exemple les fichiers .json, les fichiers .xml, les variables d’environnement et les arguments de ligne de commande. Écrivez des fournisseurs de configuration personnalisés pour prendre en charge d’autres sources.
Par défaut, les applications ASP.NET Core sont configurées pour lire à partir des variables d'environnement, de la ligne de commande et de bien plus encore. Quand la configuration de l’application est chargée, les valeurs des variables d’environnement remplacent les valeurs de appsettings.json.
Pour gérer les données de configuration confidentielles telles que les mots de passe, .NET fournit le Gestionnaire de secrets. Pour les secrets de production, nous vous recommandons Azure Key Vault.
Pour plus d’informations, consultez Configuration dans ASP.NET Core.
Environments
Les environnements d’exécution, par exemple Development, Staging et Production, sont disponibles dans ASP.NET Core. Spécifiez l’environnement d’exécution d’une application en définissant la variable d’environnement ASPNETCORE_ENVIRONMENT. ASP.NET Core lit la variable d’environnement au démarrage de l’application et stocke la valeur dans une implémentation IWebHostEnvironment. Cette implémentation est disponible n’importe où dans une application via l’injection de dépendances.
L’exemple suivant configure le gestionnaire d’exceptions et le middleware (intergiciel) HSTS (HTTP Strict Transport Security Protocol) quand l’environnement d’exécution n’est pas l’environnement Development :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez ASP.NET environnements d’exécution Core.
Logging
ASP.NET Core prend en charge une API de journalisation qui fonctionne avec un large éventail de fournisseurs de journalisation intégrés et tiers. Les fournisseurs disponibles sont les suivants :
- Console
- Debug
- Suivi des événements sur Windows
- Journal des événements Windows
- TraceSource
- Azure App Service
- Azure Application Insights
Pour créer des journaux, résolvez un service ILogger<TCategoryName> à partir de l’injection de dépendances et des méthodes de journalisation des appels telles que LogInformation. Par exemple:
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}
Pour plus d’informations, consultez Journalisation dans .NET et ASP.NET Core.
Routing
Un itinéraire est un modèle d’URL mappé à un gestionnaire. Le gestionnaire est généralement une page Razor, une méthode d’action dans un contrôleur MVC ou un middleware. Le routage ASP.NET Core vous permet de contrôler les URL utilisées par votre application.
Le code suivant, généré par le modèle d’application web ASP.NET Core, appelle UseRouting :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez Routage dans ASP.NET Core.
Gestion des erreurs
ASP.NET Core offre des fonctionnalités intégrées pour gérer des erreurs, telles que :
- Une page d’exceptions du développeur
- Pages d’erreur personnalisées
- Pages de codes d’état statique
- Gestion des exceptions de démarrage
Pour plus d’informations, consultez Gérer les erreurs dans ASP.NET Core.
Effectuer des requêtes HTTP
Une implémentation de IHttpClientFactory est disponible pour la création d’instances HttpClient. La fabrique :
- Fournit un emplacement central pour le nommage et la configuration d’instance de
HttpClientlogiques. Par exemple, inscrivez et configurez un client github pour accéder à GitHub. Inscrivez et configurez un client par défaut à d’autres fins. - Prend en charge l’inscription et le chaînage de plusieurs gestionnaires de délégation pour créer un pipeline de middlewares pour les requêtes sortantes. Ce modèle est similaire au pipeline de middleware entrant d’ASP.NET Core. Le modèle fournit un mécanisme permettant de gérer les problèmes transversaux pour les requêtes HTTP, notamment la mise en cache, la gestion des erreurs, la sérialisation et la journalisation.
- S’intègre à Polly, une bibliothèque tierce populaire pour la gestion des erreurs temporaires.
- Gère le regroupement et la durée de vie des instances de
HttpClientHandlersous-jacentes pour éviter les problèmes DNS courants qui se produisent durant la gestion manuelle des durées de vie deHttpClient. - Ajoute une expérience de journalisation configurable (via ILogger) pour toutes les requêtes envoyées via les clients créés par la fabrique.
Pour plus d’informations, consultez Effectuer des requêtes HTTP en utilisant IHttpClientFactory dans ASP.NET Core.
Racine du contenu
La racine du contenu est le chemin de base pour :
- Exécutable hébergeant l’application (.exe).
- Assemblys compilés qui composent l’application (.dll).
- Fichiers de contenu utilisés par l’application, par exemple :
- Fichiers Razor (
.cshtml,.razor) - Fichiers config (
.json,.xml) - Fichiers de données (
.db)
- Fichiers Razor (
- La Web root, généralement le dossier wwwroot.
Durant le développement, la racine du contenu correspond par défaut au répertoire racine du projet. Ce répertoire est également le chemin d’accès de base pour les fichiers de contenu de l’application et la racine web. Spécifiez une autre racine de contenu en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la racine du contenu.
La racine Web
La racine web est le chemin de base des fichiers de ressources publics statiques, par exemple :
- Feuilles de style (
.css) - JavaScript (
.js) - Images (
.png,.jpg)
Par défaut, les fichiers statiques sont traités uniquement à partir du répertoire racine web et de ses sous-répertoires. Le chemin racine web est défini par défaut sur {content root}/wwwroot. Spécifiez une autre racine web en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la Racine Web.
Empêchez la publication de fichiers dans wwwroot avec l'élément de projet <Content> dans le fichier projet. L’exemple suivant empêche la publication de contenu dans wwwroot/local et ses sous-répertoires :
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
Dans les fichiers Razor.cshtml, ~/ pointe vers la racine web. Un chemin d’accès commençant ~/ par est appelé chemin d’accès virtuel.
Pour plus d’informations, consultez Fichiers statiques dans ASP.NET Core.
Cet article fournit une vue d’ensemble des principes fondamentaux de la génération d’applications ASP.NET Core, notamment l’injection de dépendances, la configuration, les middlewares, etc.
Classe Startup
La classe Startup est l’endroit où :
- Les services nécessaires à l’application sont configurés.
- Le pipeline de traitement des requêtes de l’application est défini sous la forme d’une série de composants de middlewares.
Voici un exemple de classe Startup :
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
}
Pour plus d’informations, consultez Start-up de l’application dans ASP.NET Core.
Injection de dépendances (services)
ASP.NET Core inclut un framework d’injection de dépendances intégré, qui rend les services configurés disponibles dans l’ensemble d’une application. Par exemple, un composant de journalisation est un service.
Le code permettant de configurer (ou d’inscrire) les services est ajouté à la Startup.ConfigureServices méthode. Par exemple:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
services.AddControllersWithViews();
services.AddRazorPages();
}
Les services sont généralement résolus à partir de l’interface d’injection de dépendances à l’aide de l’injection de constructeurs. Avec l’injection de constructeurs, une classe déclare un paramètre de constructeur ayant le type ou l’interface nécessaire. Le framework d’injection de dépendances fournit une instance de ce service au moment de l’exécution.
L’exemple suivant utilise l’injection de constructeurs pour résoudre un RazorPagesMovieContext à partir de l’injection de dépendances :
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovieContext context)
{
_context = context;
}
// ...
public async Task OnGetAsync()
{
Movies = await _context.Movies.ToListAsync();
}
}
Si le conteneur IoC (inversion de contrôle) intégré ne répond pas à tous les besoins d’une application, vous pouvez utiliser un conteneur IoC tiers à la place.
Pour plus d’informations, consultez Injection de dépendances dans ASP.NET Core.
Middleware
Le pipeline de traitement des requêtes est composé comme une série de composants d’intergiciel (middleware). Chaque composant effectue des opérations sur un HttpContext, puis appelle le middleware suivant dans le pipeline, ou met fin à la requête.
Par convention, un composant de middleware est ajouté au pipeline via l’appel d’une méthode d’extension Use... dans la méthode Startup.Configure. Par exemple, pour activer le rendu des fichiers statiques, appelez UseStaticFiles.
L’exemple suivant configure un pipeline de traitement de requêtes :
public void Configure(IApplicationBuilder app)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
ASP.NET Core comprend un vaste ensemble de middlewares intégrés. Vous pouvez également écrire des composants de middlewares personnalisés.
Pour plus d’informations, consultez Intergiciel (middleware) ASP.NET Core.
Host
Au démarrage, une application ASP.NET Core génère un hôte. L’hôte encapsule toutes les ressources de l’application, par exemple :
- Une implémentation serveur HTTP
- Composants d’intergiciel
- Logging
- Services d’injection de dépendances
- Configuration
Il existe deux hôtes différents :
- Hôte générique .NET
- Hôte web ASP.NET Core
L’hôte générique .NET est recommandé. L’hôte web ASP.NET Core est disponible uniquement à des fins de compatibilité descendante.
L’exemple suivant crée un hôte générique .NET :
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Les méthodes CreateDefaultBuilder et ConfigureWebHostDefaults configurent un hôte avec un ensemble d’options par défaut, par exemple :
- Utilisez Kestrel en tant que serveur web, et activez l’intégration d’IIS.
- Chargez la configuration à partir de
appsettings.json, deappsettings.{Environment}.json, des variables d’environnement, des arguments de ligne de commande et d’autres sources de configuration. - Envoyez la sortie de journalisation aux fournisseurs Console et Debug.
Pour plus d’informations, consultez Hôte générique .NET dans ASP.NET Core.
Scénarios non web
L’hôte générique permet à d’autres types d’application d’utiliser des extensions de framework composites, par exemple la journalisation, l’injection de dépendance, la configuration et la gestion de la durée de vie de l’application. Pour plus d’informations, consultez Hôte générique .NET dans ASP.NET Core et Tâches en arrière-plan avec des services hébergés dans ASP.NET Core.
Servers
Une application ASP.NET Core utilise une implémentation de serveur HTTP pour écouter les requêtes HTTP. Le serveur expose les requêtes à l’application sous la forme d’un ensemble de fonctionnalités de requête composées en un HttpContext.
ASP.NET Core fournit les implémentations de serveur suivantes :
- Kestrel est un serveur web multiplateforme. Kestrel est souvent exécuté dans une configuration de proxy inverse à l’aide d’IIS. Dans ASP.NET Core 2.0 ou les versions ultérieures, Kestrel peut être exécuté en tant que serveur de périphérie public exposé directement à Internet.
- Le serveur HTTP IIS est un serveur pour Windows qui utilise IIS. Avec ce serveur, l’application ASP.NET Core et IIS s’exécutent dans le même processus.
- HTTP.sys est un serveur pour Windows qui n’est pas utilisé avec IIS.
Pour plus d’informations, consultez Implémentations du serveur web dans ASP.NET Core.
Configuration
ASP.NET Core fournit une infrastructure de configuration qui obtient des paramètres en tant que paires nom-valeur à partir d’un ensemble ordonné de fournisseurs de configuration. Des fournisseurs de configuration intégrés sont disponibles pour diverses sources, par exemple les fichiers .json, les fichiers .xml, les variables d’environnement et les arguments de ligne de commande. Écrivez des fournisseurs de configuration personnalisés pour prendre en charge d’autres sources.
Par défaut, les applications ASP.NET Core sont configurées pour lire à partir des variables d'environnement, de la ligne de commande et de bien plus encore. Quand la configuration de l’application est chargée, les valeurs des variables d’environnement remplacent les valeurs de appsettings.json.
La meilleure méthode pour lire les valeurs de configuration associées consiste à utiliser le modèle d’options. Pour plus d’informations, consultez Lier des données de configuration hiérarchiques à l’aide du modèle d’options.
Pour gérer les données de configuration confidentielles telles que les mots de passe, .NET fournit le Gestionnaire de secrets. Pour les secrets de production, nous vous recommandons Azure Key Vault.
Pour plus d’informations, consultez Configuration dans ASP.NET Core.
Environments
Les environnements d’exécution, par exemple Development, Staging et Production, sont une notion de premier plan dans ASP.NET Core. Spécifiez l’environnement d’exécution d’une application en définissant la variable d’environnement ASPNETCORE_ENVIRONMENT. ASP.NET Core lit la variable d’environnement au démarrage de l’application et stocke la valeur dans une implémentation IWebHostEnvironment. Cette implémentation est disponible n’importe où dans une application via l’injection de dépendances.
L’exemple suivant configure l’application pour fournir des informations détaillées sur l’erreur quand l’environnement d’exécution est l’environnement Development :
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
Pour plus d’informations, consultez ASP.NET environnements d’exécution Core.
Logging
ASP.NET Core prend en charge une API de journalisation qui fonctionne avec un large éventail de fournisseurs de journalisation intégrés et tiers. Les fournisseurs disponibles sont les suivants :
- Console
- Debug
- Suivi des événements sur Windows
- Journal des événements Windows
- TraceSource
- Azure App Service
- Azure Application Insights
Pour créer des journaux, résolvez un service ILogger<TCategoryName> à partir de l’injection de dépendances et des méthodes de journalisation des appels telles que LogInformation. Par exemple:
public class TodoController : ControllerBase
{
private readonly ILogger _logger;
public TodoController(ILogger<TodoController> logger)
{
_logger = logger;
}
[HttpGet("{id}", Name = "GetTodo")]
public ActionResult<TodoItem> GetById(string id)
{
_logger.LogInformation(LoggingEvents.GetItem, "Getting item {Id}", id);
// Item lookup code removed.
if (item == null)
{
_logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({Id}) NOT FOUND", id);
return NotFound();
}
return item;
}
}
Les méthodes de journalisation telles que LogInformation prennent en charge n’importe quel nombre de champs. Ces champs sont couramment utilisés pour construire un message string. Toutefois, certains fournisseurs de journalisation les envoient à un magasin de données en tant que champs distincts. Cette fonctionnalité permet aux fournisseurs de journalisation d’implémenter la journalisation sémantique, également appelée journalisation structurée.
Pour plus d’informations, consultez Journalisation dans .NET et ASP.NET Core.
Routing
Un itinéraire est un modèle d’URL mappé à un gestionnaire. Le gestionnaire est généralement une page Razor, une méthode d’action dans un contrôleur MVC ou un middleware. Le routage ASP.NET Core vous permet de contrôler les URL utilisées par votre application.
Pour plus d’informations, consultez Routage dans ASP.NET Core.
Gestion des erreurs
ASP.NET Core offre des fonctionnalités intégrées pour gérer des erreurs, telles que :
- Une page d’exceptions du développeur
- Pages d’erreur personnalisées
- Pages de codes d’état statique
- Gestion des exceptions de démarrage
Pour plus d’informations, consultez Gérer les erreurs dans ASP.NET Core.
Effectuer des requêtes HTTP
Une implémentation de IHttpClientFactory est disponible pour la création d’instances HttpClient. La fabrique :
- Fournit un emplacement central pour le nommage et la configuration d’instance de
HttpClientlogiques. Par exemple, inscrivez et configurez un client github pour accéder à GitHub. Inscrivez et configurez un client par défaut à d’autres fins. - Prend en charge l’inscription et le chaînage de plusieurs gestionnaires de délégation pour créer un pipeline de middlewares pour les requêtes sortantes. Ce modèle est similaire au pipeline de middleware entrant d’ASP.NET Core. Le modèle fournit un mécanisme permettant de gérer les problèmes transversaux pour les requêtes HTTP, notamment la mise en cache, la gestion des erreurs, la sérialisation et la journalisation.
- S’intègre à Polly, une bibliothèque tierce populaire pour la gestion des erreurs temporaires.
- Gère le regroupement et la durée de vie des instances de
HttpClientHandlersous-jacentes pour éviter les problèmes DNS courants qui se produisent durant la gestion manuelle des durées de vie deHttpClient. - Ajoute une expérience de journalisation configurable (via ILogger) pour toutes les requêtes envoyées via les clients créés par la fabrique.
Pour plus d’informations, consultez Effectuer des requêtes HTTP en utilisant IHttpClientFactory dans ASP.NET Core.
Racine du contenu
La racine du contenu est le chemin de base pour :
- Exécutable hébergeant l’application (.exe).
- Assemblys compilés qui composent l’application (.dll).
- Fichiers de contenu utilisés par l’application, par exemple :
- Fichiers Razor (
.cshtml,.razor) - Fichiers config (
.json,.xml) - Fichiers de données (
.db)
- Fichiers Razor (
- La Web root, généralement le dossier wwwroot.
Durant le développement, la racine du contenu correspond par défaut au répertoire racine du projet. Ce répertoire est également le chemin d’accès de base pour les fichiers de contenu de l’application et la racine web. Spécifiez une autre racine de contenu en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la racine du contenu.
La racine Web
La racine web est le chemin de base des fichiers de ressources publics statiques, par exemple :
- Feuilles de style (
.css) - JavaScript (
.js) - Images (
.png,.jpg)
Par défaut, les fichiers statiques sont traités uniquement à partir du répertoire racine web et de ses sous-répertoires. Le chemin racine web est défini par défaut sur {content root}/wwwroot. Spécifiez une autre racine web en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la Racine Web.
Empêchez la publication de fichiers dans wwwroot avec l'élément de projet <Content> dans le fichier projet. L’exemple suivant empêche la publication de contenu dans wwwroot/local et ses sous-répertoires :
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
Dans les fichiers Razor.cshtml, ~/ (tilde-barre oblique) pointe vers la racine web. Un chemin d’accès commençant ~/ par est appelé chemin d’accès virtuel.
Pour plus d’informations, consultez Fichiers statiques dans ASP.NET Core.
Comment télécharger un exemple
La plupart des articles et tutoriels contiennent des liens vers des exemples de code.
- Téléchargez le fichier zip du dépôt ASP.NET.
- Décompressez le fichier
AspNetCore.Docs-main.zip. - Pour accéder à l’exemple d’application d’un article dans le référentiel décompressé, utilisez l’URL du lien de l’exemple de cet article. En règle générale, l’exemple de lien d’un article apparaît en haut de l’article avec le texte de lien Afficher ou télécharger l’exemple de code.
Directives de préprocesseur dans l’exemple de code
Pour montrer plusieurs scénarios, les exemples d’applications utilisent les directives pré-processeur #define et #if-#else/#elif-#endif pour compiler et exécuter différentes sections de l’exemple de code de manière sélective. Pour ces exemples qui utilisent cette approche, définissez la directive #define en haut des fichiers C# pour définir le symbole associé au scénario que vous souhaitez exécuter. Certains exemples exigent que vous définissiez le symbole en haut de plusieurs fichiers afin d’exécuter un scénario.
Par exemple, la liste des symboles #define suivante indique que les quatre scénarios sont disponibles (un scénario par symbole). La configuration actuelle de l’exemple exécute le scénario TemplateCode :
#define TemplateCode // or LogFromMain or ExpandDefault or FilterInCode
Pour que l’exemple exécute le scénario ExpandDefault, définissez le symbole ExpandDefault et laissez les symboles restants commentés :
#define ExpandDefault // TemplateCode or LogFromMain or FilterInCode
Pour plus d’informations sur l’utilisation des directives de préprocesseur C# pour compiler de manière sélective des sections de code, consultez #define (référence C#) et #if (référence C#).
Régions dans l’exemple de code
Certains exemples d’applications contiennent des sections de code entourées de directives #region et #endregion C#. Le système de génération de documentation injecte ces régions dans les rubriques de documentation rendues.
Les noms de région contiennent généralement le mot « extrait de code ». L’exemple suivant montre une région nommée snippet_WebHostDefaults:
#region snippet_WebHostDefaults
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
#endregion
L’extrait de code C# précédent est référencé dans le fichier markdown de la rubrique avec la ligne suivante :
[!code-csharp[](sample/SampleApp/Program.cs?name=snippet_WebHostDefaults)]
Vous pouvez ignorer ou supprimer en toute sécurité les directives #region et #endregion qui entourent le code. Ne modifiez pas le code dans ces directives si vous envisagez d’exécuter les exemples de scénarios décrits dans la rubrique.
Pour plus d’informations, consultez Contribuer à la documentation ASP.NET : extraits de code.
Cet article fournit une vue d’ensemble des principes fondamentaux de la génération d’applications ASP.NET Core, notamment l’injection de dépendances, la configuration, les middlewares, etc.
Pour des conseils sur les principes fondamentaux sur Blazor, qui complètent ou remplacent les conseils de ce nœud, voir les principes fondamentaux d'ASP.NET CoreBlazor.
Program.cs
Les applications ASP.NET Core créées avec les modèles web contiennent le code de démarrage de l’application dans le fichier Program.cs. Le fichier Program.cs se trouve à l’emplacement où :
- Les services nécessaires à l’application sont configurés.
- Le pipeline de gestion des demandes de l’application est défini comme une série de composants middleware.
Le code de démarrage d’application suivant prend en charge les éléments suivants :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Injection de dépendances (services)
ASP.NET Core inclut l’injection de dépendances (DI) qui rend les services configurés disponibles dans l’ensemble d’une application. Les services sont ajoutés au conteneur d’adresses di avec WebApplicationBuilder.Services, builder.Services dans le code précédent. Lorsque WebApplicationBuilder est instancié, de nombreux services fournis par le framework sont ajoutés.
builder est un WebApplicationBuilder dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
Dans le code en surbrillance précédent, builder permet l’ajout de la configuration, de la journalisation et de nombreux autres services au conteneur d’injection de dépendances.
Le code suivant ajoute des pages Razor, des contrôleurs MVC avec vues et un DbContext personnalisé au conteneur d’injection de dépendances :
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RPMovieContext")));
var app = builder.Build();
Les services sont généralement résolus à partir de l’interface d’injection de dépendances à l’aide de l’injection de constructeurs. Le framework d’injection de dépendances fournit une instance de ce service au moment de l’exécution.
Le code suivant utilise l’injection de constructeurs pour résoudre le contexte de base de données et le journaliseur à partir de l’injection de dépendances :
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}
Middleware
Le pipeline de traitement des requêtes est composé comme une série de composants d’intergiciel (middleware). Chaque composant effectue des opérations sur un HttpContext, puis appelle le middleware suivant dans le pipeline, ou met fin à la requête.
Par convention, un composant de middleware est ajouté au pipeline via l’appel d’une méthode d’extension Use{Feature}. Le middleware ajouté à l’application est mis en évidence dans le code suivant :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez Intergiciel (middleware) ASP.NET Core.
Host
Au démarrage, une application ASP.NET Core génère un hôte. L’hôte encapsule toutes les ressources de l’application, par exemple :
- Une implémentation serveur HTTP
- Composants d’intergiciel
- Logging
- Services d’injection de dépendances
- Configuration
Il existe trois types d’hôtes capables d’exécuter une application ASP.NET Core :
- ASP.NET Core WebApplication, également appelé Hôte minimal
- Hôte générique .NET combiné au ConfigureWebHostDefaults d'ASP.NET Core
- ASP.NET Core WebHost
Les types ASP.NET Core WebApplication et WebApplicationBuilder sont recommandés et utilisés dans tous les modèles ASP.NET Core.
WebApplication se comporte de la même manière que l’hôte générique .NET et expose la plupart des mêmes interfaces, mais nécessite moins de rappels à configurer. L’hôte web ASP.NET Core WebHost est disponible uniquement à des fins de compatibilité descendante.
L'exemple suivant instancie un objet WebApplication :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
La méthode WebApplicationBuilder.Build configure un hôte avec un ensemble d’options par défaut, telles que :
- Utilisez Kestrel en tant que serveur web, et activez l’intégration d’IIS.
- Chargez la configuration à partir de
appsettings.json, des variables d’environnement, des arguments de ligne de commande et d’autres sources de configuration. - Envoyez la sortie de journalisation aux fournisseurs Console et Debug.
Scénarios non web
L’hôte générique permet à d’autres types d’application d’utiliser des extensions de framework composites, par exemple la journalisation, l’injection de dépendance, la configuration et la gestion de la durée de vie de l’application. Pour plus d’informations, consultez Hôte générique .NET dans ASP.NET Core et Tâches en arrière-plan avec des services hébergés dans ASP.NET Core.
Servers
Une application ASP.NET Core utilise une implémentation de serveur HTTP pour écouter les requêtes HTTP. Le serveur expose les requêtes à l’application sous la forme d’un ensemble de fonctionnalités de requête composées en un HttpContext.
ASP.NET Core fournit les implémentations de serveur suivantes :
- Kestrel est un serveur web multiplateforme. Kestrel est souvent exécuté dans une configuration de proxy inverse à l’aide d’IIS. Dans ASP.NET Core 2.0 ou les versions ultérieures, Kestrel peut être exécuté en tant que serveur de périphérie public exposé directement à Internet.
- Le serveur HTTP IIS est un serveur pour Windows qui utilise IIS. Avec ce serveur, l’application ASP.NET Core et IIS s’exécutent dans le même processus.
- HTTP.sys est un serveur pour Windows qui n’est pas utilisé avec IIS.
Pour plus d’informations, consultez Implémentations du serveur web dans ASP.NET Core.
Configuration
ASP.NET Core fournit une infrastructure de configuration qui obtient des paramètres en tant que paires nom-valeur à partir d’un ensemble ordonné de fournisseurs de configuration. Des fournisseurs de configuration intégrés sont disponibles pour diverses sources, par exemple les fichiers .json, les fichiers .xml, les variables d’environnement et les arguments de ligne de commande. Écrivez des fournisseurs de configuration personnalisés pour prendre en charge d’autres sources.
Par défaut, les applications ASP.NET Core sont configurées pour lire à partir des variables d'environnement, de la ligne de commande et de bien plus encore. Quand la configuration de l’application est chargée, les valeurs des variables d’environnement remplacent les valeurs de appsettings.json.
Pour gérer les données de configuration confidentielles telles que les mots de passe, .NET fournit le Gestionnaire de secrets. Pour les secrets de production, nous vous recommandons Azure Key Vault.
Pour plus d’informations, consultez Configuration dans ASP.NET Core.
Environments
Les environnements d’exécution, par exemple Development, Staging et Production, sont disponibles dans ASP.NET Core. Spécifiez l’environnement d’exécution d’une application en définissant la variable d’environnement ASPNETCORE_ENVIRONMENT. ASP.NET Core lit la variable d’environnement au démarrage de l’application et stocke la valeur dans une implémentation IWebHostEnvironment. Cette implémentation est disponible n’importe où dans une application via l’injection de dépendances.
L’exemple suivant configure le gestionnaire d’exceptions et le middleware (intergiciel) HSTS (HTTP Strict Transport Security Protocol) quand l’environnement d’exécution n’est pas l’environnement Development :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez ASP.NET environnements d’exécution Core.
Logging
ASP.NET Core prend en charge une API de journalisation qui fonctionne avec un large éventail de fournisseurs de journalisation intégrés et tiers. Les fournisseurs disponibles sont les suivants :
- Console
- Debug
- Suivi des événements sur Windows
- Journal des événements Windows
- TraceSource
- Azure App Service
- Azure Application Insights
Pour créer des journaux, résolvez un service ILogger<TCategoryName> à partir de l’injection de dépendances et des méthodes de journalisation des appels telles que LogInformation. Par exemple:
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}
Pour plus d’informations, consultez Journalisation dans .NET et ASP.NET Core.
Routing
Un itinéraire est un modèle d’URL mappé à un gestionnaire. Le gestionnaire est généralement une page Razor, une méthode d’action dans un contrôleur MVC ou un middleware. Le routage ASP.NET Core vous permet de contrôler les URL utilisées par votre application.
Le code suivant, généré par le modèle d’application web ASP.NET Core, appelle UseRouting :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Pour plus d’informations, consultez Routage dans ASP.NET Core.
Gestion des erreurs
ASP.NET Core offre des fonctionnalités intégrées pour gérer des erreurs, telles que :
- Une page d’exceptions du développeur
- Pages d’erreur personnalisées
- Pages de codes d’état statique
- Gestion des exceptions de démarrage
Pour plus d’informations, consultez Gérer les erreurs dans ASP.NET Core.
Effectuer des requêtes HTTP
Une implémentation de IHttpClientFactory est disponible pour la création d’instances HttpClient. La fabrique :
- Fournit un emplacement central pour le nommage et la configuration d’instance de
HttpClientlogiques. Par exemple, inscrivez et configurez un client github pour accéder à GitHub. Inscrivez et configurez un client par défaut à d’autres fins. - Prend en charge l’inscription et le chaînage de plusieurs gestionnaires de délégation pour créer un pipeline de middlewares pour les requêtes sortantes. Ce modèle est similaire au pipeline de middleware entrant d’ASP.NET Core. Le modèle fournit un mécanisme permettant de gérer les problèmes transversaux pour les requêtes HTTP, notamment la mise en cache, la gestion des erreurs, la sérialisation et la journalisation.
- S’intègre à Polly, une bibliothèque tierce populaire pour la gestion des erreurs temporaires.
- Gère le regroupement et la durée de vie des instances de
HttpClientHandlersous-jacentes pour éviter les problèmes DNS courants qui se produisent durant la gestion manuelle des durées de vie deHttpClient. - Ajoute une expérience de journalisation configurable (via ILogger) pour toutes les requêtes envoyées via les clients créés par la fabrique.
Pour plus d’informations, consultez Effectuer des requêtes HTTP en utilisant IHttpClientFactory dans ASP.NET Core.
Racine du contenu
La racine du contenu est le chemin de base pour :
- Exécutable hébergeant l’application (.exe).
- Assemblys compilés qui composent l’application (.dll).
- Fichiers de contenu utilisés par l’application, par exemple :
- Fichiers Razor (
.cshtml,.razor) - Fichiers config (
.json,.xml) - Fichiers de données (
.db)
- Fichiers Razor (
- La Web root, généralement le dossier wwwroot.
Durant le développement, la racine du contenu correspond par défaut au répertoire racine du projet. Ce répertoire est également le chemin d’accès de base pour les fichiers de contenu de l’application et la racine web. Spécifiez une autre racine de contenu en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la racine du contenu.
La racine Web
La racine web est le chemin de base des fichiers de ressources publics statiques, par exemple :
- Feuilles de style (
.css) - JavaScript (
.js) - Images (
.png,.jpg)
Par défaut, les fichiers statiques sont traités uniquement à partir du répertoire racine web et de ses sous-répertoires. Le chemin racine web est défini par défaut sur {content root}/wwwroot. Spécifiez une autre racine web en définissant son chemin au moment de la génération de l’hôte. Pour plus d’informations, consultez la Racine Web.
Empêchez la publication de fichiers dans wwwroot avec l'élément de projet <Content> dans le fichier projet. L’exemple suivant empêche la publication de contenu dans wwwroot/local et ses sous-répertoires :
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
Dans les fichiers Razor.cshtml, ~/ pointe vers la racine web. Un chemin d’accès commençant ~/ par est appelé chemin d’accès virtuel.
Pour plus d’informations, consultez Fichiers statiques dans ASP.NET Core.
Comment télécharger un exemple
La plupart des articles et tutoriels contiennent des liens vers des exemples de code.
- Téléchargez le fichier zip du dépôt ASP.NET.
- Décompressez le fichier
AspNetCore.Docs-main.zip. - Pour accéder à l’exemple d’application d’un article dans le référentiel décompressé, utilisez l’URL du lien de l’exemple de cet article. En règle générale, l’exemple de lien d’un article apparaît en haut de l’article avec le texte de lien Afficher ou télécharger l’exemple de code.
Directives de préprocesseur dans l’exemple de code
Pour montrer plusieurs scénarios, les exemples d’applications utilisent les directives pré-processeur #define et #if-#else/#elif-#endif pour compiler et exécuter différentes sections de l’exemple de code de manière sélective. Pour ces exemples qui utilisent cette approche, définissez la directive #define en haut des fichiers C# pour définir le symbole associé au scénario que vous souhaitez exécuter. Certains exemples exigent que vous définissiez le symbole en haut de plusieurs fichiers afin d’exécuter un scénario.
Par exemple, la liste des symboles #define suivante indique que les quatre scénarios sont disponibles (un scénario par symbole). La configuration actuelle de l’exemple exécute le scénario TemplateCode :
#define TemplateCode // or LogFromMain or ExpandDefault or FilterInCode
Pour que l’exemple exécute le scénario ExpandDefault, définissez le symbole ExpandDefault et laissez les symboles restants commentés :
#define ExpandDefault // TemplateCode or LogFromMain or FilterInCode
Pour plus d’informations sur l’utilisation des directives de préprocesseur C# pour compiler de manière sélective des sections de code, consultez #define (référence C#) et #if (référence C#).
Régions dans l’exemple de code
Certains exemples d’applications contiennent des sections de code entourées de directives #region et #endregion C#. Le système de génération de documentation injecte ces régions dans les rubriques de documentation rendues.
Les noms de région contiennent généralement le mot « extrait de code ». L’exemple suivant montre une région nommée snippet_WebHostDefaults:
#region snippet_WebHostDefaults
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
#endregion
L’extrait de code C# précédent est référencé dans le fichier markdown de la rubrique avec la ligne suivante :
[!code-csharp[](sample/SampleApp/Program.cs?name=snippet_WebHostDefaults)]
Vous pouvez ignorer ou supprimer en toute sécurité les directives #region et #endregion qui entourent le code. Ne modifiez pas le code dans ces directives si vous envisagez d’exécuter les exemples de scénarios décrits dans la rubrique.
Pour plus d’informations, consultez Contribuer à la documentation ASP.NET : extraits de code.