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.

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 Přizpůsobení hodnoty souhlasucookie.

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:

  1. Dříve zadaný BindingInfo.BindingSource text se nikdy nepřepíše.
  2. Je přiřazen BindingSource.Servicesparametr komplexního typu zaregistrovaný v kontejneru DI .
  3. Je přiřazen BindingSource.Bodyparametr komplexního typu, který není registrován v kontejneru DI .
  4. Parametr s názvem, který se zobrazí jako hodnota trasy v jakékoli šabloně trasy, je přiřazen BindingSource.Path.
  5. Všechny ostatní parametry jsou BindingSource.Query.

JSNázvy vlastností ON 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, například jednostrákové aplikace, můžou využívat JSnázvy vlastností ON pro chyby ověřování vygenerované z webových rozhraní API. Následující kód konfiguruje ověřování tak, aby používal SystemTextJsonValidationMetadataProviderJSnázvy vlastností ON:

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í Json.NET používal NewtonsoftJsonValidationMetadataProviderJSnázev vlastnosti ON:

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í JSnázvů vlastností ON 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 StreamPipeReader

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 rozhraní .NET 6 IResult bylo zavedeno, aby představovalo hodnoty vrácené z minimálních rozhraní API, které nevyužívají implicitní podporu pro JSserializaci 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ů:

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 QueryPrivateTodospro 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

JSPřekódování PŘI

gRPC JSON transkódování je rozšíření pro ASP.NET Core, které vytváří RESTful JSON API pro služby gRPC. gRPC JSON transkódování umožňuje:

  • Aplikace pro volání služeb gRPC se známými koncepty HTTP
  • ASP.NET aplikace Core gRPC pro podporu gRPC i RESTful JSON API bez replikace funkcí.
  • Experimentální podpora generování OpenAPI z transkódovaných 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 gRPC JSON transkódování ASP.NET Core aplikací.

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ána UnsafeUseInsecureChannelCallCredentials, umožňuje toto chování přizpůsobit. Zabezpečení připojení pomocí protokolu TLS má vliv na zabezpečení.
  • V klientské továrně gRPC je k dispozici nová volána AddCallCredentials 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 zachyceny this 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:

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 ASP.NET ověřování základních Blazor 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 ASP.NET komponenta Core Blazor 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ý prvek overflow-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 ASP.NET Zpracování událostí CoreBlazor.

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 ASP.NET Spuštění coreBlazor.

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 ASP.NET Protokolování jádraBlazor.

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:

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:

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:

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 plýtvání prostředky procesoru jsou k dispozici pro zbytek 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í:

Výkon streamování serveru gRPC

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 zlepš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 čas spuštění, aby porozuměly výkonu spouštění a optimalizovaly ho. 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ů

Https Připojení ionAdapterOptions má novou vlastnost ServerCertificateChain typu X509Certificate2Collection, která usnadňuje ověřování řetězů certifikátů tím, že umožňuje zadat úplný řetěz 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á:

výstup pro dotnet watch

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 truehodnotu .

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:

Tmavý režim nástroje F12 FF

V Chromu:

Nástroje F12 v tmavém režimu 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 příkazy nejvyšší úrovně a vygenerovat namespace a metodu deklarovanou Main ve Program 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ě:

Checkbox

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 JSwebových tokenů ON 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í JStokeny ON Web Tokens (JWT). Další informace najdete v tématu Správa JSwebových tokenů ON při 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.