Novinky v ASP.NET Core 7.0
Tento článek popisuje nejvýznamnější změny v ASP.NET Core 7.0 s odkazy na příslušnou dokumentaci.
Omezování rychlosti middlewaru v ASP.NET Core
Middleware Microsoft.AspNetCore.RateLimiting
poskytuje omezování rychlosti middlewaru. Aplikace konfigurují zásady omezování rychlosti a pak zásady připojují ke koncovým bodům. Další informace najdete v tématu Omezování rychlosti middlewaru v ASP.NET Core.
Ověřování používá jako výchozíscheme jedno schéma.
V rámci práce na zjednodušení ověřování se při registraci pouze jednoho schématu ověřování automaticky použije jako DefaultScheme a není nutné ho zadávat. Další informace naleznete v tématu DefaultScheme.
MVC a Razor stránky
Podpora modelů s možnou hodnotou null v zobrazeních MVC a Razor stránkách
Modely stránky nebo zobrazení s možnou hodnotou null se podporují, aby se zlepšilo používání kontroly stavu null s aplikacemi ASP.NET Core:
@model Product?
Vytvoření vazby v IParsable<T>.TryParse
řadičích MVC a API
Rozhraní IParsable<TSelf>.TryParse
API podporuje hodnoty parametrů akce kontroleru vazby. Další informace naleznete v tématu Vazba s IParsable<T>.TryParse
.
Přizpůsobení hodnoty souhlasu cookie
Ve verzích ASP.NET Core starších než 7 cookie používá ověření souhlasu cookie hodnotu yes
k označení souhlasu. Teď můžete zadat hodnotu, která představuje souhlas. Můžete například použít true
místo yes
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
options.ConsentCookieValue = "true";
});
var app = builder.Build();
Další informace najdete v tématu cookie souhlasu.
Kontrolery rozhraní API
Vazba parametrů s DI v kontrolery rozhraní API
Vazby parametrů pro akce kontroleru rozhraní API sváže parametry prostřednictvím injektáže závislostí, když je typ nakonfigurovaný jako služba. To znamená, že už není nutné explicitně použít [FromServices]
atribut na parametr. V následujícím kódu vrátí obě akce čas:
[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
public ActionResult GetWithAttribute([FromServices] IDateTime dateTime)
=> Ok(dateTime.Now);
[Route("noAttribute")]
public ActionResult Get(IDateTime dateTime) => Ok(dateTime.Now);
}
Ve výjimečných případech může automatické DI přerušit aplikace, které mají typ v DI, který je přijat také v metodě akce kontrolerů rozhraní API. Není běžné mít typ v DI a jako argument v akci kontroleru rozhraní API. Pokud chcete zakázat automatickou vazbu parametrů, nastavte DisableImplicitFromServicesParameters.
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton<IDateTime, SystemDateTime>();
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.DisableImplicitFromServicesParameters = true;
});
var app = builder.Build();
app.MapControllers();
app.Run();
V ASP.NET Core 7.0 se typy v DI kontrolují při spuštění aplikace a IServiceProviderIsService určí, jestli argument v akci kontroleru rozhraní API pochází z DI nebo z jiných zdrojů.
Nový mechanismus odvození zdroje vazeb parametrů akce kontroleru rozhraní API používá následující pravidla:
- Dříve zadaný
BindingInfo.BindingSource
text se nikdy nepřepíše. - Je přiřazen
BindingSource.Services
parametr komplexního typu zaregistrovaný v kontejneru DI . - Je přiřazen
BindingSource.Body
parametr komplexního typu, který není registrován v kontejneru DI . - Parametr s názvem, který se zobrazí jako hodnota trasy v jakékoli šabloně trasy, je přiřazen
BindingSource.Path
. - Všechny ostatní parametry jsou
BindingSource.Query
.
Názvy vlastností JSON v chybách ověřování
Ve výchozím nastavení při výskytu chyby ověření vytvoří ověření ModelStateDictionary modelu název vlastnosti jako klíč chyby. Některé aplikace, jako jsou jednostrákové aplikace, využívají názvy vlastností JSON pro chyby ověřování vygenerované z webových rozhraní API. Následující kód nakonfiguruje ověření tak, aby používal SystemTextJsonValidationMetadataProvider
názvy vlastností JSON:
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider());
});
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Následující kód konfiguruje ověřování tak, aby při použití NewtonsoftJsonValidationMetadataProvider
používal název vlastnosti JSON:
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new NewtonsoftJsonValidationMetadataProvider());
}).AddNewtonsoftJson();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Další informace najdete v tématu Použití názvů vlastností JSON v chybách ověřování.
Minimální rozhraní API
Filtry v aplikacích s minimálním rozhraním API
Minimální filtry rozhraní API umožňují vývojářům implementovat obchodní logiku, která podporuje:
- Spuštění kódu před a za obslužnou rutinou trasy.
- Kontrola a úprava parametrů zadaných během vyvolání obslužné rutiny trasy
- Zachycení chování odpovědi obslužné rutiny trasy
Filtry můžou být užitečné v následujících scénářích:
- Ověření parametrů požadavku a textu odesílaných do koncového bodu
- Protokolování informací o požadavku a odpovědi
- Ověření, že požadavek cílí na podporovanou verzi rozhraní API.
Další informace najdete v tématu Filtry v minimálních aplikacích API.
Vytvoření vazby polí a řetězcových hodnot ze záhlaví a řetězců dotazu
V ASP.NET 7 je podporována vazba řetězců dotazu na pole primitivních typů, řetězcových polí a StringValues :
// Bind query string values to a primitive type array.
// GET /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) =>
$"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}");
// Bind to a string array.
// GET /tags2?names=john&names=jack&names=jane
app.MapGet("/tags2", (string[] names) =>
$"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}");
// Bind to StringValues.
// GET /tags3?names=john&names=jack&names=jane
app.MapGet("/tags3", (StringValues names) =>
$"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}");
Vazby řetězců dotazu nebo hodnot hlaviček na pole komplexních typů se podporují, když je TryParse
typ implementovaný. Další informace naleznete v tématu Vytvoření vazby polí a řetězcových hodnot z hlaviček a řetězců dotazu.
Další informace najdete v tématu Přidání souhrnu nebo popisu koncového bodu.
Vytvoření vazby textu požadavku jako nebo Stream
PipeReader
Tělo požadavku může svázat jako Stream
scénáře nebo PipeReader
efektivně podporovat scénáře, kdy uživatel musí zpracovávat data a:
- Uložte data do úložiště objektů blob nebo vytvořte frontu dat poskytovateli fronty.
- Zpracování uložených dat pomocí pracovního procesu nebo cloudové funkce
Data můžou být například zařazená do fronty Azure Storage nebo uložená ve službě Azure Blob Storage.
Další informace najdete v tématu Vytvoření vazby textu požadavku jako objektu Stream
nebo PipeReader
New Results.Stream – přetížení
Zavedli jsme nová Results.Stream
přetížení, která by vyhovovala scénářům, které potřebují přístup k podkladovému streamu odpovědí HTTP bez ukládání do vyrovnávací paměti. Tato přetížení také vylepšují případy, kdy rozhraní API streamuje data do datového proudu odpovědi HTTP, například ze služby Azure Blob Storage. Následující příklad používá ImageSharp k vrácení zmenšené velikosti zadané image:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Processing;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/process-image/{strImage}", (string strImage, HttpContext http, CancellationToken token) =>
{
http.Response.Headers.CacheControl = $"public,max-age={TimeSpan.FromHours(24).TotalSeconds}";
return Results.Stream(stream => ResizeImageAsync(strImage, stream, token), "image/jpeg");
});
async Task ResizeImageAsync(string strImage, Stream stream, CancellationToken token)
{
var strPath = $"wwwroot/img/{strImage}";
using var image = await Image.LoadAsync(strPath, token);
int width = image.Width / 2;
int height = image.Height / 2;
image.Mutate(x =>x.Resize(width, height));
await image.SaveAsync(stream, JpegFormat.Instance, cancellationToken: token);
}
Další informace najdete v příkladech služby Stream.
Zadané výsledky pro minimální rozhraní API
V .NET 6 bylo IResult rozhraní zavedeno tak, aby představovalo hodnoty vrácené z minimálních rozhraní API, které nevyužívají implicitní podporu pro serializaci vráceného objektu do odpovědi HTTP.
Static Results třída slouží k vytvoření různých IResult
objektů, které představují různé typy odpovědí. Můžete například nastavit stavový kód odpovědi nebo přesměrovat na jinou adresu URL. Implementace IResult
typů rozhraní vrácených z těchto metod však byla interní, což znesnadňuje ověření konkrétního IResult
typu vráceného z metod v testu jednotek.
V rozhraní .NET 7 jsou typy implementované IResult
jako veřejné, což umožňuje při testování kontrolní výrazy typů. Příklad:
[TestClass()]
public class WeatherApiTests
{
[TestMethod()]
public void MapWeatherApiTest()
{
var result = WeatherApi.GetAllWeathers();
Assert.IsInstanceOfType(result, typeof(Ok<WeatherForecast[]>));
}
}
Vylepšená testovatelnost jednotek pro minimální obslužné rutiny tras
IResult Typy implementace jsou nyní veřejně dostupné v Microsoft.AspNetCore.Http.HttpResults oboru názvů. Typy IResult
implementace lze použít k testování minimálních obslužných rutin tras při použití pojmenovaných metod místo lambda.
Následující kód používá Ok<TValue>
třídu:
[Fact]
public async Task GetTodoReturnsTodoFromDatabase()
{
// Arrange
await using var context = new MockDb().CreateDbContext();
context.Todos.Add(new Todo
{
Id = 1,
Title = "Test title",
Description = "Test description",
IsDone = false
});
await context.SaveChangesAsync();
// Act
var result = await TodoEndpointsV1.GetTodo(1, context);
//Assert
Assert.IsType<Results<Ok<Todo>, NotFound>>(result);
var okResult = (Ok<Todo>)result.Result;
Assert.NotNull(okResult.Value);
Assert.Equal(1, okResult.Value.Id);
}
Další informace najdete v tématu IResult
Typy implementace.
Nová rozhraní HttpResult
Následující rozhraní v Microsoft.AspNetCore.Http oboru názvů poskytují způsob, jak zjistit IResult
typ za běhu, což je běžný vzor v implementacích filtrů:
- IContentTypeHttpResult
- IFileHttpResult
- INestedHttpResult
- IStatusCodeHttpResult
- IValueHttpResult
- IValueHttpResult<TValue>
Další informace naleznete v tématu IHttpResult rozhraní.
Vylepšení OpenAPI pro minimální rozhraní API
Microsoft.AspNetCore.OpenApi
Balíček NuGet
Balíček Microsoft.AspNetCore.OpenApi
umožňuje interakci se specifikacemi OpenAPI pro koncové body. Balíček funguje jako propojení mezi modely OpenAPI definovanými v Microsoft.AspNetCore.OpenApi
balíčku a koncovými body definovanými v minimálních rozhraních API. Balíček poskytuje rozhraní API, které zkoumá parametry koncového bodu, odpovědi a metadata a vytváří typ anotace OpenAPI, který se používá k popisu koncového bodu.
app.MapPost("/todoitems/{id}", async (int id, Todo todo, TodoDb db) =>
{
todo.Id = id;
db.Todos.Add(todo);
await db.SaveChangesAsync();
return Results.Created($"/todoitems/{todo.Id}", todo);
})
.WithOpenApi();
Volání WithOpenApi
s parametry
Metoda WithOpenApi
přijímá funkci, kterou lze použít k úpravě anotace OpenAPI. Například v následujícím kódu se k prvnímu parametru koncového bodu přidá popis:
app.MapPost("/todo2/{id}", async (int id, Todo todo, TodoDb db) =>
{
todo.Id = id;
db.Todos.Add(todo);
await db.SaveChangesAsync();
return Results.Created($"/todoitems/{todo.Id}", todo);
})
.WithOpenApi(generatedOperation =>
{
var parameter = generatedOperation.Parameters[0];
parameter.Description = "The ID associated with the created Todo";
return generatedOperation;
});
Zadání popisů a souhrnů koncových bodů
Minimální rozhraní API teď podporují operace přidávání poznámek s popisy a souhrny pro generování specifikace OpenAPI. Metody rozšíření WithDescriptionWithSummary můžete volat nebo použít atributy [EndpointDescription] a [EndpointSummary]).
Další informace najdete v tématu OpenAPI v minimálních aplikacích API.
Nahrávání souborů pomocí IFormFile a IFormFileCollection
Minimální rozhraní API teď podporují nahrávání souborů pomocí IFormFile
a IFormFileCollection
. Následující kód používá IFormFile a IFormFileCollection nahrává soubor:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapPost("/upload", async (IFormFile file) =>
{
var tempFile = Path.GetTempFileName();
app.Logger.LogInformation(tempFile);
using var stream = File.OpenWrite(tempFile);
await file.CopyToAsync(stream);
});
app.MapPost("/upload_many", async (IFormFileCollection myFiles) =>
{
foreach (var file in myFiles)
{
var tempFile = Path.GetTempFileName();
app.Logger.LogInformation(tempFile);
using var stream = File.OpenWrite(tempFile);
await file.CopyToAsync(stream);
}
});
app.Run();
Žádosti o nahrání ověřených souborů se podporují pomocí autorizační hlavičky, klientského certifikátu nebo hlavičky cookie .
Antiforgery nepodporuje žádná integrovaná podpora. Dá se ale implementovat pomocí IAntiforgery
služby.
[AsParameters]
atribut povoluje vazbu parametrů pro seznamy argumentů.
Atribut [AsParameters]
povoluje vazbu parametrů pro seznamy argumentů. Další informace naleznete v tématu Vazby parametru pro seznamy argumentů s [AsParameters]
.
Minimální rozhraní API a kontrolery rozhraní API
Nová služba podrobností o problému
Služba podrobností problému implementuje IProblemDetailsService rozhraní, které podporuje vytváření podrobností o problému pro rozhraní HTTP API.
Další informace naleznete v tématu Služba podrobností o problému.
Skupiny tras
Metoda MapGroup rozšíření pomáhá uspořádat skupiny koncových bodů s běžnou předponou. Snižuje opakující se kód a umožňuje přizpůsobit celé skupiny koncových bodů jediným voláním metod, jako RequireAuthorization jsou a WithMetadata které přidávají metadata koncového bodu.
Například následující kód vytvoří dvě podobné skupiny koncových bodů:
app.MapGroup("/public/todos")
.MapTodosApi()
.WithTags("Public");
app.MapGroup("/private/todos")
.MapTodosApi()
.WithTags("Private")
.AddEndpointFilterFactory(QueryPrivateTodos)
.RequireAuthorization();
EndpointFilterDelegate QueryPrivateTodos(EndpointFilterFactoryContext factoryContext, EndpointFilterDelegate next)
{
var dbContextIndex = -1;
foreach (var argument in factoryContext.MethodInfo.GetParameters())
{
if (argument.ParameterType == typeof(TodoDb))
{
dbContextIndex = argument.Position;
break;
}
}
// Skip filter if the method doesn't have a TodoDb parameter.
if (dbContextIndex < 0)
{
return next;
}
return async invocationContext =>
{
var dbContext = invocationContext.GetArgument<TodoDb>(dbContextIndex);
dbContext.IsPrivate = true;
try
{
return await next(invocationContext);
}
finally
{
// This should only be relevant if you're pooling or otherwise reusing the DbContext instance.
dbContext.IsPrivate = false;
}
};
}
public static RouteGroupBuilder MapTodosApi(this RouteGroupBuilder group)
{
group.MapGet("/", GetAllTodos);
group.MapGet("/{id}", GetTodo);
group.MapPost("/", CreateTodo);
group.MapPut("/{id}", UpdateTodo);
group.MapDelete("/{id}", DeleteTodo);
return group;
}
V tomto scénáři můžete použít relativní adresu hlavičky Location
ve výsledku 201 Created
:
public static async Task<Created<Todo>> CreateTodo(Todo todo, TodoDb database)
{
await database.AddAsync(todo);
await database.SaveChangesAsync();
return TypedResults.Created($"{todo.Id}", todo);
}
První skupina koncových bodů se bude shodovat pouze s požadavky s předponou /public/todos
a jsou přístupná bez ověřování. Druhá skupina koncových bodů bude odpovídat pouze požadavkům s předponou /private/todos
a vyžaduje ověření.
Objekt QueryPrivateTodos
pro filtrování koncových bodů je místní funkce, která upravuje parametry obslužné rutiny TodoDb
trasy tak, aby umožňovala přístup k privátním datům úkolů a jejich ukládání.
Skupiny tras také podporují vnořené skupiny a složité vzory předpon s parametry trasy a omezeními. V následujícím příkladu a obslužná rutina trasy namapovaná na user
skupinu může zachytit {org}
parametry a {group}
parametry trasy definované v předponách vnější skupiny.
Předpona může být také prázdná. To může být užitečné pro přidání metadat koncového bodu nebo filtrů do skupiny koncových bodů beze změny vzoru trasy.
var all = app.MapGroup("").WithOpenApi();
var org = all.MapGroup("{org}");
var user = org.MapGroup("{user}");
user.MapGet("", (string org, string user) => $"{org}/{user}");
Přidání filtrů nebo metadat do skupiny se chová stejně jako jejich individuální přidání do každého koncového bodu před přidáním dalších filtrů nebo metadat, které mohly být přidány do vnitřní skupiny nebo konkrétního koncového bodu.
var outer = app.MapGroup("/outer");
var inner = outer.MapGroup("/inner");
inner.AddEndpointFilter((context, next) =>
{
app.Logger.LogInformation("/inner group filter");
return next(context);
});
outer.AddEndpointFilter((context, next) =>
{
app.Logger.LogInformation("/outer group filter");
return next(context);
});
inner.MapGet("/", () => "Hi!").AddEndpointFilter((context, next) =>
{
app.Logger.LogInformation("MapGet filter");
return next(context);
});
V předchozím příkladu vnější filtr zapíše příchozí požadavek před vnitřním filtrem, i když byl přidán druhý. Vzhledem k tomu, že filtry byly použity u různých skupin, pořadí, které byly přidány vzhledem k sobě, nezáleží. Přidají se filtry objednávek bez ohledu na to, jestli se použije na stejnou skupinu nebo konkrétní koncový bod.
Žádost o /outer/inner/
protokolování bude následující:
/outer group filter
/inner group filter
MapGet filter
gRPC
Překódování JSON
gRPC JSON transkódování je rozšíření pro ASP.NET Core, které vytváří rozhraní RESTful JSON API pro služby gRPC. Transkódování JSON gRPC umožňuje:
- Aplikace pro volání služeb gRPC se známými koncepty HTTP
- ASP.NET aplikací Core gRPC pro podporu rozhraní API gRPC i RESTful JSON bez replikace funkcí.
- Experimentální podpora generování OpenAPI z transkódovaných rozhraní RESTful API integrací s Swashbuckle
Další informace najdete v tématu gRPC JSON transkódování v aplikacích ASP.NET Core gRPC a použití OpenAPI s transkódováním gRPC JSON ASP.NET Core.
Kontroly stavu gRPC v ASP.NET Core
Protokol kontroly stavu gRPC je standard pro hlášení stavu serverových aplikací gRPC. Aplikace zveřejňuje kontroly stavu jako službu gRPC. Obvykle se používají s externí monitorovací službou ke kontrole stavu aplikace.
GRPC ASP.NET Core přidala integrovanou podporu kontrol stavu gRPC s balíčkem Grpc.AspNetCore.HealthChecks
. Volajícím se hlásí výsledky kontrol stavu .NET.
Další informace najdete v tématu kontroly stavu gRPC v ASP.NET Core.
Vylepšená podpora přihlašovacích údajů pro volání
Přihlašovací údaje volání představují doporučený způsob konfigurace klienta gRPC pro odeslání ověřovacího tokenu na server. Klienti gRPC podporují dvě nové funkce, které usnadňují používání přihlašovacích údajů volání:
- Podpora přihlašovacích údajů pro volání s připojeními ve formátu prostého textu Dříve volání gRPC bylo odesláno pouze přihlašovací údaje volání, pokud bylo připojení zabezpečené pomocí protokolu TLS. Nové nastavení
GrpcChannelOptions
, volánaUnsafeUseInsecureChannelCallCredentials
, umožňuje toto chování přizpůsobit. Zabezpečení připojení pomocí protokolu TLS má vliv na zabezpečení. - V klientské továrně
AddCallCredentials
nová volána metoda.AddCallCredentials
je rychlý způsob konfigurace přihlašovacích údajů volání pro klienta gRPC a dobře se integruje s injektáží závislostí (DI).
Následující kód nakonfiguruje klientskou továrnu gRPC tak, aby odesílala Authorization
metadata:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddCallCredentials((context, metadata) =>
{
if (!string.IsNullOrEmpty(_token))
{
metadata.Add("Authorization", $"Bearer {_token}");
}
return Task.CompletedTask;
});
Další informace najdete v tématu Konfigurace nosný token pomocí klientské továrny gRPC.
SignalR
Výsledky klienta
Server teď podporuje vyžádání výsledku z klienta. To vyžaduje, aby server používal ISingleClientProxy.InvokeAsync
a klient vrátil výsledek z jeho .On
obslužné rutiny. Rozbočovače silného typu můžou také vracet hodnoty z metod rozhraní.
Další informace najdete v tématu Výsledky klienta.
Injektáž závislostí pro SignalR metody centra
SignalR Metody centra teď podporují vkládání služeb prostřednictvím injektáže závislostí (DI).
Konstruktory centra mohou přijímat služby z DI jako parametry, které mohou být uloženy ve vlastnostech třídy pro použití v metodě centra. Další informace najdete v tématu Vložení služeb do centra.
Blazor
Zpracování změn umístění a stavu navigace
V .NET 7 Blazor podporuje změny polohy a udržování navigačního stavu. To vám umožní upozornit uživatele na neuložené práce nebo provádět související akce, když uživatel provede navigaci na stránce.
Další informace najdete v následujících částech článku Směrování a navigace :
Prázdné Blazor šablony projektů
Blazor obsahuje dvě nové šablony projektu pro zahájení od prázdného slate. Nové Blazor Server šablony projektů Prázdné aplikace a Blazor WebAssembly Prázdné aplikace jsou stejně jako jejich neprázdné protějšky, ale bez ukázkového kódu. Tyto prázdné šablony obsahují jenom základní domovskou stránku a odebrali jsme Bootstrap, abyste mohli začít s jinou architekturou CSS.
Další informace najdete v následujících článcích:
Vlastní elementy Blazor
Balíček Microsoft.AspNetCore.Components.CustomElements
umožňuje vytvářet standardy založené na vlastních prvcích DOM pomocí Blazor.
Další informace najdete v tématu ASP.NET základní Razor komponenty.
Modifikátory vazby (@bind:after
, @bind:get
, @bind:set
)
Důležité
Funkce @bind:after
/@bind:get
/@bind:set
v tuto chvíli dostávají další aktualizace. Pokud chcete využívat nejnovější aktualizace, ověřte, že jste nainstalovali nejnovější sadu SDK.
Použití parametru zpětného volání události ([Parameter] public EventCallback<string> ValueChanged { get; set; }
) není podporováno. Místo toho předejte metodu Action-returning nebo Task-returning do@bind:set
/@bind:after
.
Další informace naleznete v následujících zdrojích:
V .NET 7 můžete spustit asynchronní logiku po dokončení události vazby pomocí nového @bind:after
modifikátoru. V následujícím příkladu se PerformSearch
asynchronní metoda spustí automaticky po zjištění jakýchkoli změn hledaného textu:
<input @bind="searchText" @bind:after="PerformSearch" />
@code {
private string searchText;
private async Task PerformSearch()
{
...
}
}
V .NET 7 je také jednodušší nastavit vazbu pro parametry komponenty. Komponenty můžou podporovat obousměrnou datovou vazbu definováním dvojice parametrů:
-
@bind:get
: Určuje hodnotu, která se má svázat. -
@bind:set
: Určuje zpětné volání pro, když se hodnota změní.
Modifikátory @bind:get
a @bind:set
modifikátory se vždy používají společně.
Příklady:
@* Elements *@
<input type="text" @bind="text" @bind:after="() => { }" />
<input type="text" @bind:get="text" @bind:set="(value) => { }" />
<input type="text" @bind="text" @bind:after="AfterAsync" />
<input type="text" @bind:get="text" @bind:set="SetAsync" />
<input type="text" @bind="text" @bind:after="() => { }" />
<input type="text" @bind:get="text" @bind:set="(value) => { }" />
<input type="text" @bind="text" @bind:after="AfterAsync" />
<input type="text" @bind:get="text" @bind:set="SetAsync" />
@* Components *@
<InputText @bind-Value="text" @bind-Value:after="() => { }" />
<InputText @bind-Value:get="text" @bind-Value:set="(value) => { }" />
<InputText @bind-Value="text" @bind-Value:after="AfterAsync" />
<InputText @bind-Value:get="text" @bind-Value:set="SetAsync" />
<InputText @bind-Value="text" @bind-Value:after="() => { }" />
<InputText @bind-Value:get="text" @bind-Value:set="(value) => { }" />
<InputText @bind-Value="text" @bind-Value:after="AfterAsync" />
<InputText @bind-Value:get="text" @bind-Value:set="SetAsync" />
@code {
private string text = "";
private void After(){}
private void Set() {}
private Task AfterAsync() { return Task.CompletedTask; }
private Task SetAsync(string value) { return Task.CompletedTask; }
}
Další informace o komponentě InputText
najdete v tématu ASP.NET Blazor základní vstupní komponenty.
vylepšení Opětovné načítání za provozu
V .NET 7 Opětovné načítání za provozu podpora zahrnuje následující:
- Komponenty při odebrání hodnoty resetují své parametry na výchozí hodnoty.
-
Blazor WebAssembly:
- Přidejte nové typy.
- Přidejte vnořené třídy.
- Přidání statických metod a metod instancí do existujících typů
- Přidejte do existujících typů statická pole a metody.
- Přidejte statické lambda do existujících metod.
- Přidejte lambda, které zachycují
this
existující metody, které už byly zachycenythis
dříve.
Žádosti o dynamické ověřování s msAL v Blazor WebAssembly
Novinka v .NET 7 Blazor WebAssembly podporuje vytváření žádostí dynamického ověřování za běhu s vlastními parametry pro zpracování pokročilých scénářů ověřování.
Další informace najdete v následujících článcích:
- Zabezpečení ASP.NET Core Blazor WebAssembly
- Další scénáře zabezpečení ASP.NET Core Blazor WebAssembly
Blazor WebAssembly Vylepšení ladění
Blazor WebAssembly Ladění má následující vylepšení:
- Podpora nastavení Jen můj kód pro zobrazení nebo skrytí členů typu, které nejsou v uživatelském kódu.
- Podpora kontroly multidimenzionálních polí
- Zásobník volání teď zobrazuje správný název asynchronních metod.
- Vylepšené vyhodnocení výrazu
- Správné zpracování klíčového
new
slova u odvozených členů - Podpora atributů souvisejících s ladicím programem v souboru
System.Diagnostics
.
System.Security.Cryptography
podpora pro WebAssembly
.NET 6 podporovala řadu algoritmů hash SHA při spuštění na WebAssembly. .NET 7 umožňuje více kryptografických algoritmů, SubtleCryptopokud je to možné, a vrácením zpět k implementaci .NET, pokud SubtleCrypto není možné použít. WebAssembly v .NET 7 podporuje následující algoritmy:
- SHA1
- SHA256
- SHA384
- SHA512
- HMACSHA1
- HMACSHA256
- HMACSHA384
- HMACSHA512
- AES-CBC
- PBKDF2
- HKDF
Další informace najdete v tématu Vývojáři, kteří cílí na prohlížeč-wasm, mohou používat rozhraní WEB Crypto API (dotnet/runtime #40074).
Vložení služeb do vlastních ověřovacích atributů
Služby teď můžete vložit do vlastních ověřovacích atributů.
Blazor nastaví ValidationContext
tak, aby ji bylo možné použít jako poskytovatele služeb.
Další informace najdete v tématu Blazor základních formulářů.
Input*
součásti mimo EditContext
/EditForm
Integrované vstupní komponenty jsou nyní podporovány mimo formulář v Razor kódu komponenty.
Další informace najdete v tématu ASP.NET Blazor základní vstupní komponenty.
Změny šablony projektu
Když byl .NET 6 vydán loni, kód HTML _Host
stránky (Pages/_Host.chstml
) byl rozdělen mezi _Host
stránku a novou _Layout
stránku (Pages/_Layout.chstml
) v šabloně projektu .NET 6 Blazor Server .
V .NET 7 byl kód HTML rekombinován se stránkou _Host
v šablonách projektů.
V šablonách projektu bylo provedeno Blazor několik dalších změn. Není možné vypsat všechny změny šablon v dokumentaci. Pokud chcete migrovat aplikaci na .NET 7, abyste mohli přijmout všechny změny, přečtěte si téma Migrace z ASP.NET Core 6.0 na verzi 7.0.
Experimentální QuickGrid
komponenta
Nová QuickGrid
komponenta poskytuje pohodlnou komponentu datové mřížky pro nejběžnější požadavky a jako referenční architekturu a standardní hodnoty výkonu pro každého, kdo sestavuje Blazor komponenty datové mřížky.
Další informace najdete v tématu Blazor Core QuickGrid.
Živá ukázka: QuickGrid pro Blazor ukázkovou aplikaci
Vylepšení virtualizace
Vylepšení virtualizace v .NET 7:
- Komponenta
Virtualize
podporuje použití samotného dokumentu jako kořenového adresáře posouvání, jako alternativu k tomu, že je použit nějaký jiný prvekoverflow-y: scroll
. - Pokud je komponenta
Virtualize
umístěna uvnitř elementu, který vyžaduje konkrétní název podřízené značky,SpacerElement
umožňuje získat nebo nastavit název značky mezerníku virtualizace.
Další informace najdete v následujících částech článku Virtualizace :
MouseEventArgs
Aktualizace
MovementX
a MovementY
byly přidány do MouseEventArgs
.
Další informace najdete v tématu Blazor událostí Core.
Nová Blazor stránka načítání
Šablona Blazor WebAssembly projektu má nové uživatelské rozhraní pro načítání, které ukazuje průběh načítání aplikace.
Další informace najdete v tématu Blazor core.
Vylepšená diagnostika ověřování v Blazor WebAssembly
Pro usnadnění diagnostiky problémů s ověřováním v Blazor WebAssembly aplikacích je k dispozici podrobné protokolování.
Další informace najdete v tématu Blazor jádra.
Interoperabilita JavaScriptu ve službě WebAssembly
Rozhraní API pro interoperabilitu JavaScriptu [JSImport]
/[JSExport]
je nový mechanismus nízké úrovně pro používání .NET v Blazor WebAssembly aplikacích založených na JavaScriptu a aplikacích založených na JavaScriptu. Díky této nové funkci spolupráce JavaScriptu můžete kód .NET vyvolat z JavaScriptu pomocí modulu runtime .NET WebAssembly a volat funkce JavaScriptu z .NET bez jakékoli závislosti na Blazor modelu komponent uživatelského rozhraní.
Další informace:
- JavaScript JSImport/JSExport interop s ASP.NET Core Blazor: Týká se pouze Blazor WebAssembly aplikací.
- Interoperabilita JavaScriptu [JSImport]/[JSExport] v .NET WebAssembly: Týká se pouze aplikací JavaScriptu, které nezávisí na Blazor modelu komponent uživatelského rozhraní.
Podmíněná registrace zprostředkovatele stavu ověřování
Před vydáním rozhraní .NET 7 AuthenticationStateProvider
byla zaregistrována v kontejneru služby s AddScoped
. Kvůli tomu je obtížné ladit aplikace, protože při poskytování vlastní implementace vynutila konkrétní pořadí registrací služeb. Vzhledem k interním změnám architektury v průběhu času už není nutné se registrovat AuthenticationStateProvider
u AddScoped
.
V kódu vývojáře proveďte následující změnu registrace služby poskytovatele stavu ověřování:
- builder.Services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
+ builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
V předchozím příkladu ExternalAuthStateProvider
je implementace služby vývojáře.
Vylepšení nástrojů pro sestavení .NET WebAssembly
Nové funkce v wasm-tools
úloze pro .NET 7, které pomáhají zlepšit výkon a zpracovat výjimky:
- Jedna instrukce WebAssembly, podpora více dat (SIMD) (pouze s AOT, nepodporuje Apple Safari)
- Podpora zpracování výjimek WebAssembly
Další informace najdete v tématu ASP.NET nástroje sestavení Core Blazor WebAssembly a kompilace AOT (Head-of-Time).
Blazor Hybrid
Externí adresy URL
Byla přidána možnost, která umožňuje otevírání externích webových stránek v prohlížeči.
Další informace najdete v tématu ASP.NET Blazor Hybrid Základní směrování a navigace.
Zabezpečení
Pro scénáře zabezpečení jsou k dispozici Blazor Hybrid nové pokyny. Další informace najdete v následujících článcích:
Výkon
Middleware pro ukládání výstupu do mezipaměti
Ukládání výstupu do mezipaměti je nový middleware, který ukládá odpovědi z webové aplikace a obsluhuje je z mezipaměti a ne pokaždé je počítá. Ukládání výstupu do mezipaměti se liší od ukládání odpovědí do mezipaměti následujícími způsoby:
- Chování při ukládání do mezipaměti je možné konfigurovat na serveru.
- Položky mezipaměti lze programově zneplatnit.
- Uzamčení prostředků snižuje riziko razítka mezipaměti a hřmění herdy.
- Obnovení mezipaměti znamená, že server může místo textu odpovědi uložené v mezipaměti vrátit stavový
304 Not Modified
kód HTTP. - Médium úložiště mezipaměti je rozšiřitelné.
Další informace najdete v tématu Přehled ukládání do mezipaměti a middlewaru ukládání výstupu do mezipaměti.
Vylepšení PROTOKOLU HTTP/3
Tato verze:
- Plně podporuje protokol HTTP/3 ASP.NET Core, už není experimentální.
- Zlepšuje Kestrelpodporu protokolu HTTP/3. Dvě hlavní oblasti vylepšení jsou parita funkcí s HTTP/1.1 a HTTP/2 a výkon.
- Poskytuje úplnou podporu pro UseHttps(ListenOptions, X509Certificate2) HTTP/3. Kestrelnabízí pokročilé možnosti konfigurace certifikátů připojení, jako je připojení k indikaci názvu serveru (SNI).
- Přidává podporu protokolu HTTP/3 v HTTP.sys a službě IIS.
Následující příklad ukazuje, jak pomocí zpětného volání SNI přeložit možnosti protokolu TLS:
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Https;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(8080, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps(new TlsHandshakeCallbackOptions
{
OnConnection = context =>
{
var options = new SslServerAuthenticationOptions
{
ServerCertificate =
MyResolveCertForHost(context.ClientHelloInfo.ServerName)
};
return new ValueTask<SslServerAuthenticationOptions>(options);
},
});
});
});
V .NET 7 byla provedena významná práce s cílem snížit přidělení HTTP/3. Některá z těchto vylepšení si můžete prohlédnout v následujících žádostech o přijetí změn gitHubu:
- HTTP/3: Vyhněte se přidělení tokenů zrušení pro jednotlivé požadavky
- HTTP/3: Vyhněte se přidělení connectionAbortedException
- HTTP/3: Sdružování HodnotTask
Vylepšení výkonu HTTP/2
.NET 7 představuje významnou opětovnou architekturu procesů Kestrel požadavků HTTP/2. ASP.NET aplikace Core s zaneprázdněnými připojeními HTTP/2 budou mít nižší využití procesoru a vyšší propustnost.
Dříve implementace multiplexingu HTTP/2 spoléhala na zámek , který určuje, který požadavek může zapisovat do základního připojení TCP. Fronta bezpečná pro přístup z více vláken nahrazuje zámek zápisu. Teď místo boje proti tomu, které vlákno začne používat zámek zápisu, požadavky se teď zařadí do fronty a vyhrazený příjemce je zpracuje. Dříve nevyužité prostředky procesoru jsou nyní k dispozici zbytku aplikace.
Jedním z míst, kde si tato vylepšení můžete všimnout, je gRPC, oblíbená architektura RPC, která používá PROTOKOL HTTP/2. Kestrel + srovnávací testy gRPC ukazují výrazné zlepšení:
Změny byly provedeny v kódu zápisu rámce HTTP/2, které zlepšují výkon, když se několik datových proudů pokouší zapisovat data do jednoho připojení HTTP/2. Nyní odesíláme protokol TLS do fondu vláken a rychleji uvolníme zámek zápisu, který ostatní datové proudy mohou získat k zápisu dat. Snížení doby čekání může přinést významná vylepšení výkonu v případech, kdy dochází k kolizím pro tento zámek zápisu. Srovnávací test gRPC s 70 datovými proudy na jednom připojení (s protokolem TLS) ukázal přibližně 15% zlepšení požadavků za sekundu (RPS) s touto změnou.
Podpora protokolu Http/2 WebSocket
.NET 7 zavádí webSockety přes http/2 podporu , Kestreljavascriptového SignalR klienta a SignalR s Blazor WebAssembly.
Použití webSocketů přes PROTOKOL HTTP/2 využívá nové funkce, jako jsou:
- Komprese hlaviček.
- Multiplexing, což zkracuje čas a prostředky potřebné při provádění více požadavků na server.
Tyto podporované funkce jsou dostupné na Kestrel všech platformách s podporou HTTP/2. Vyjednávání verzí je v prohlížečích automatické, Kestreltakže nejsou potřeba žádná nová rozhraní API.
Další informace naleznete v tématu Http/2 WebSockets podpora.
Kestrel vylepšení výkonu na počítačích s vysokým jádrem
Kestrel pro ConcurrentQueue<T> mnoho účelů. Jedním účelem je plánování vstupně-výstupních operací ve Kestrelvýchozím přenosu soketů. Dělení ConcurrentQueue
na základě přidruženého soketu snižuje kolize a zvyšuje propustnost na počítačích s mnoha jádry procesoru.
Profilace na počítačích s velkými jádry na platformě .NET 6 ukázala významné kolize v jedné z Kestreldalších ConcurrentQueue
instancí, PinnedMemoryPool
která Kestrel se používá k ukládání bajtů do mezipaměti.
V .NET 7 Kestrelje fond paměti rozdělený stejným způsobem jako fronta vstupně-výstupních operací, což vede k mnohem nižší kolizím a vyšší propustnosti na počítačích s vysokým jádrem. Na virtuálních počítačích ARM64 s 80 jádry vidíme více než 500% zlepšení odpovědí za sekundu (RPS) v srovnávacím testu Prostého textu TechEmpower. Na virtuálních počítačích AMD s 48 jádry je vylepšení téměř 100 % v našem srovnávacím testu HTTPS JSON.
ServerReady
událost pro měření času spuštění
Aplikace využívající EventSource můžou měřit dobu spuštění, aby porozuměla výkonu spouštění a optimalizovala ji. Nová ServerReady
událost představuje bod, ve Microsoft.AspNetCore.Hosting kterém je server připravený reagovat na požadavky.
Server
Nová událost ServerReady pro měření doby spuštění
Událost ServerReady
byla přidána k měření doby spuštění aplikací ASP.NET Core.
IIS
Stínová kopie ve službě IIS
Sestavení aplikace stínové kopie do ASP.NET základního modulu (ANCM) pro službu IIS můžou poskytovat lepší prostředí koncového uživatele než zastavení aplikace nasazením offline souboru aplikace.
Další informace naleznete v tématu Stínová kopie ve službě IIS.
Různé
Kestrel úplná vylepšení řetězu certifikátů
HttpsConnectionAdapterOptions má novou vlastnost ServerCertificateChain typu X509Certificate2Collection, která usnadňuje ověřování řetězů certifikátů povolením úplného řetězu včetně zprostředkujících certifikátů. Další podrobnosti najdete v tématu dotnet/aspnetcore#21513 .
dotnet watch
Vylepšený výstup konzoly pro dotnet watch
Výstup konzoly z dotnet watch byl vylepšen tak, aby lépe odpovídal protokolování ASP.NET Core a aby vynikal😮 emoji😍.
Tady je příklad, jak nový výstup vypadá:
Další informace najdete v této žádosti o přijetí změn na GitHubu.
Konfigurace dotnet watch tak, aby se vždy restartoval pro hrubé úpravy
Rudé úpravy jsou úpravy, které nelze znovu načíst za provozu. Pokud chcete nakonfigurovat dotnet watch tak, aby se vždy restartoval bez výzvy k hrubým úpravám, nastavte DOTNET_WATCH_RESTART_ON_RUDE_EDIT
proměnnou prostředí na true
hodnotu .
Tmavý režim stránky výjimky pro vývojáře
Podpora tmavého režimu byla přidána na stránku výjimky pro vývojáře, díky příspěvku Patrick Westerhoff. Pokud chcete otestovat tmavý režim v prohlížeči, na stránce vývojářských nástrojů nastavte režim na tmavý. Například ve Firefoxu:
V Chromu:
Možnost šablony projektu pro použití metody Program.Main místo příkazů nejvyšší úrovně
Šablony .NET 7 obsahují možnost nepoužívat a metodu deklarovanou namespace
ve Main
třídě.
Pomocí rozhraní příkazového řádku .NET použijte tuto --use-program-main
možnost:
dotnet new web --use-program-main
V sadě Visual Studio zaškrtněte políčko Nové při vytváření projektu nepoužívat příkazy nejvyšší úrovně:
Aktualizace šablon Angular a React
Šablona projektu Angular byla aktualizována na Angular 14. Šablona projektu React byla aktualizována na React 18.2.
Správa webových tokenů JSON ve vývoji pomocí dotnet user-jwts
Nový dotnet user-jwts
nástroj příkazového řádku může vytvořit a spravovat místní webové tokeny JSON specifické pro aplikaci (JWT). Další informace najdete v tématu Správa webových tokenů JSON ve vývoji pomocí dotnet user-jwts.
Podpora dalších hlaviček požadavků v W3CLoggeru
Teď můžete zadat další hlavičky požadavku, které se mají protokolovat při použití protokolovacího nástroje W3C voláním AdditionalRequestHeaders()
W3CLoggerOptions:
services.AddW3CLogging(logging =>
{
logging.AdditionalRequestHeaders.Add("x-forwarded-for");
logging.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
});
Další informace naleznete v tématu W3CLogger možnosti.
Dekomprese požadavku
Nový middleware dekomprese požadavku:
- Umožňuje koncovým bodům rozhraní API přijímat požadavky s komprimovaným obsahem.
- Používá hlavičku
Content-Encoding
HTTP k automatické identifikaci a dekomprimaci požadavků, které obsahují komprimovaný obsah. - Eliminuje potřebu psát kód pro zpracování komprimovaných požadavků.
Další informace najdete v tématu Middleware pro dekompresi požadavku.