ASP.NET Core 7.0'daki yenilikler

Bu makalede, ilgili belgelerin bağlantıları ile ASP.NET Core 7.0'daki en önemli değişiklikler vurgulanır.

ASP.NET Core'da hız sınırlama ara yazılımı

Ara Microsoft.AspNetCore.RateLimiting yazılım, hız sınırlama ara yazılımı sağlar. Uygulamalar hız sınırlama ilkelerini yapılandırıp ilkeleri uç noktalara ekler. Daha fazla bilgi için bkz . ASP.NET Core'da hız sınırlama ara yazılımı.

Kimlik doğrulaması, DefaultScheme olarak tek bir düzen kullanır

Kimlik doğrulamasını basitleştirme çalışmasının bir parçası olarak, yalnızca tek bir kimlik doğrulama şeması kaydedildiğinde, otomatik olarak DefaultScheme olarak kullanılır ve belirtilmesi gerekmez. Daha fazla bilgi için bkz . DefaultScheme.

MVC ve Razor sayfalar

MVC görünümlerinde ve Razor Sayfalarında boş değer atanabilir modeller için destek

Null değer atanabilir sayfa veya görünüm modelleri, ASP.NET Core uygulamalarıyla null durum denetimi kullanılırken deneyimi geliştirmek için desteklenir:

@model Product?

MVC ve API Denetleyicilerinde ile bağlama IParsable<T>.TryParse

API, IParsable<TSelf>.TryParse bağlama denetleyicisi eylem parametresi değerlerini destekler. Daha fazla bilgi için bkz . ile IParsable<T>.TryParsebağlama.

7'den önceki ASP.NET Core sürümlerinde onay doğrulaması, cookie onayı belirtmek için değerini yes kullanırcookie. Artık onayı temsil eden değeri belirtebilirsiniz. Örneğin, yerine yeskullanabilirsiniztrue:

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();

Daha fazla bilgi için bkz. Onay değerini özelleştirmecookie.

API denetleyicileri

API denetleyicilerinde DI ile parametre bağlama

API denetleyicisi eylemleri için parametre bağlama, tür hizmet olarak yapılandırıldığında bağımlılık ekleme yoluyla parametreleri bağlar. Bu, özniteliği bir parametreye açıkça uygulamak [FromServices] için artık gerekli olmadığı anlamına gelir. Aşağıdaki kodda, her iki eylem de saati döndürür:

[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);
}

Nadir durumlarda, otomatik DI, BIR API denetleyicileri eylem yönteminde de kabul edilen DI türüne sahip uygulamaları bozabilir. DI'de ve API denetleyicisi eyleminde bağımsız değişken olarak bir türe sahip olmak yaygın değildir. Parametrelerin otomatik bağlamasını devre dışı bırakmak için DisableImplicitFromServicesParameters'ı ayarlayın

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();

ASP.NET Core 7.0'da, BIR API denetleyicisi eylemindeki bir bağımsız değişkenin DI'den mi yoksa diğer kaynaklardan mı geldiğini belirlemek için ile uygulama başlangıcında IServiceProviderIsService DI'deki türler denetlenir.

API Denetleyicisi eylem parametrelerinin bağlama kaynağını çıkarsamak için yeni mekanizma aşağıdaki kuralları kullanır:

  1. Önceden belirtilen BindingInfo.BindingSource bir değerin üzerine hiçbir zaman yazılmaz.
  2. DI kapsayıcısında kayıtlı karmaşık tür parametresi atanır BindingSource.Services.
  3. DI kapsayıcısında kayıtlı olmayan karmaşık tür parametresine atanır BindingSource.Body.
  4. Herhangi bir yol şablonunda yol değeri olarak görünen ada sahip bir parametre atanırBindingSource.Path.
  5. Diğer tüm parametreler şunlardır: BindingSource.Query.

JSDoğrulama hatalarında ON özellik adları

Varsayılan olarak, bir doğrulama hatası oluştuğunda model doğrulaması, hata anahtarı olarak özellik adıyla bir ModelStateDictionary oluşturur. Tek sayfalı uygulamalar gibi bazı uygulamalar, Web API'lerinden oluşturulan doğrulama hataları için ON özellik adlarının kullanılmasından JSyararlanmaktadır. Aşağıdaki kod, on özellik adlarını kullanmak için öğesini kullanmak SystemTextJsonValidationMetadataProvider JSüzere doğrulamayı yapılandırmaktadır:

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();

Aşağıdaki kod, Json.NET kullanırken ON özellik adını kullanmak JSiçin doğrulamayı NewtonsoftJsonValidationMetadataProvider yapılandırmaktadır:

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();

Daha fazla bilgi için bkz. Doğrulama hatalarında ON özellik adlarını kullanma JS

Minimal API'ler

Minimal API uygulamalarında filtreler

En düşük API filtreleri, geliştiricilerin şunları destekleyen iş mantığını uygulamasına olanak sağlar:

  • Yol işleyiciden önce ve sonra kod çalıştırma.
  • Yol işleyicisi çağırma sırasında sağlanan parametreleri inceleme ve değiştirme.
  • Yol işleyicisinin yanıt davranışını kesme.

Filtreler aşağıdaki senaryolarda yararlı olabilir:

  • Bir uç noktaya gönderilen istek parametrelerini ve gövdesini doğrulama.
  • İstek ve yanıt hakkındaki günlük bilgileri.
  • İsteğin desteklenen bir API sürümünü hedeflediğini doğrulama.

Daha fazla bilgi için bkz . Minimum API uygulamalarında filtreler

Üst bilgilerden ve sorgu dizelerinden dizileri ve dize değerlerini bağlama

ASP.NET 7'de sorgu dizelerini ilkel türler, dize dizileri ve StringValues dizilerine bağlama desteklenir:

// 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]}");

Sorgu dizelerini veya üst bilgi değerlerini karmaşık türlerden oluşan bir diziye bağlama, tür TryParse uygulandığında desteklenir. Daha fazla bilgi için bkz . Üst bilgilerden ve sorgu dizelerinden dizileri ve dize değerlerini bağlama.

Daha fazla bilgi için bkz . Uç nokta özeti veya açıklaması ekleme.

İstek gövdesini veya Stream olarak bağlama PipeReader

İstek gövdesi, kullanıcının verileri işlemesi gereken senaryoları verimli bir Stream şekilde desteklemek için veya PipeReader olarak bağlanabilir ve:

  • Verileri blob depolamaya depolayın veya bir kuyruk sağlayıcısına sıralayın.
  • Depolanan verileri bir çalışan işlemi veya bulut işleviyle işleme.

Örneğin, veriler Azure Kuyruk depolama alanına sıralanabilir veya Azure Blob depolamada depolanabilir.

Daha fazla bilgi için bkz . İstek gövdesini veya Stream olarak bağlama PipeReader

Yeni Results.Stream aşırı yüklemeleri

Arabelleğe almadan temel alınan HTTP yanıt akışına erişmesi gereken senaryoları barındırmak için yeni Results.Stream aşırı yüklemeler kullanıma sunulmuştur. Bu aşırı yüklemeler, API'nin http yanıt akışına veri akışı yaptığı durumları da (örneğin, Azure Blob Depolama) iyileştirir. Aşağıdaki örnek, belirtilen görüntünün daha küçük bir boyutunu döndürmek için ImageSharp'ı kullanır:

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);
}

Daha fazla bilgi için bkz . Stream örnekleri

Minimum API'ler için yazılan sonuçlar

.NET 6'da, IResult döndürülen nesneyi HTTP yanıtına seri hale getirmek için JSON örtük desteğini kullanmayan en düşük API'lerden döndürülen değerleri temsil eden arabirim tanıtıldı. Statik Results sınıfı, farklı yanıt türlerini temsil eden farklı IResult nesneler oluşturmak için kullanılır. Örneğin, yanıt durum kodunu ayarlama veya başka bir URL'ye yönlendirme. Bununla IResult birlikte, bu yöntemlerden döndürülen uygulama çerçevesi türleri iç türlerdi, bu da birim testindeki yöntemlerden döndürülen belirli IResult türü doğrulamayı zorlaştırıyordu.

.NET 7'de uygulayan IResult türler geneldir ve test sırasında tür onaylarına olanak sağlar. Örneğin:

[TestClass()]
public class WeatherApiTests
{
    [TestMethod()]
    public void MapWeatherApiTest()
    {
        var result = WeatherApi.GetAllWeathers();
        Assert.IsInstanceOfType(result, typeof(Ok<WeatherForecast[]>));
    }      
}

En düşük yol işleyicileri için geliştirilmiş birim test edilebilirliği

IResult uygulama türleri artık ad alanında Microsoft.AspNetCore.Http.HttpResults genel kullanıma sunulmuştur. Uygulama IResult türleri, lambda yerine adlandırılmış yöntemler kullanılırken minimum yol işleyicilerini birim testi için kullanılabilir.

Aşağıdaki kod sınıfını Ok<TValue> kullanır:

[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);
}

Daha fazla bilgi için bkz IResult . uygulama türleri.

Yeni HttpResult arabirimleri

Ad alanında Microsoft.AspNetCore.Http aşağıdaki arabirimler, filtre uygulamalarında yaygın olarak kullanılan bir desen olan çalışma zamanında türü algılamak IResult için bir yol sağlar:

Daha fazla bilgi için bkz . IHttpResult arabirimleri.

Minimum API'ler için OpenAPI geliştirmeleri

Microsoft.AspNetCore.OpenApi NuGet paketi

Paket, Microsoft.AspNetCore.OpenApi uç noktalar için OpenAPI belirtimleriyle etkileşimlere izin verir. Paket, pakette tanımlanan OpenAPI modelleri ile En Düşük API'lerde Microsoft.AspNetCore.OpenApi tanımlanan uç noktalar arasında bir bağlantı işlevi görür. Paket, uç noktayı açıklamak için kullanılan bir OpenAPI ek açıklama türü oluşturmak için uç noktanın parametrelerini, yanıtlarını ve meta verilerini inceleyen bir API sağlar.

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();

Parametrelerle çağrı WithOpenApi

yöntemi, WithOpenApi OpenAPI ek açıklamasını değiştirmek için kullanılabilecek bir işlevi kabul eder. Örneğin, aşağıdaki kodda uç noktanın ilk parametresine bir açıklama eklenir:

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;
});

Uç nokta açıklamalarını ve özetlerini sağlama

Minimum API'ler artık OpenAPI belirtimi oluşturma için açıklama ve özetlerle işlem açıklamalarını destekliyor. Uzantı yöntemlerini WithDescription çağırabilir ve WithSummary [EndpointDescription] ve [EndpointSummary] özniteliklerini kullanabilirsiniz.

Daha fazla bilgi için bkz. Minimum API uygulamalarında OpenAPI

IFormFile ve IFormFileCollection kullanılarak dosya yüklemeleri

Minimum API'ler artık ve IFormFileCollectionile IFormFile dosya yüklemeyi destekliyor. Aşağıdaki kod dosyayı karşıya yüklemek için ve IFormFileCollection kullanırIFormFile:

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();

Kimliği doğrulanmış dosya yükleme istekleri Yetkilendirme üst bilgisi, istemci sertifikası veya cookie üst bilgi kullanılarak desteklenir.

Antiforgery için yerleşik destek yoktur. Ancak, hizmeti kullanılarak IAntiforgery uygulanabilir.

[AsParameters] attribute, bağımsız değişken listeleri için parametre bağlamayı etkinleştirir

özniteliği, [AsParameters] bağımsız değişken listeleri için parametre bağlamayı etkinleştirir. Daha fazla bilgi için bkz . ile [AsParameters]bağımsız değişken listeleri için parametre bağlama.

Minimum API'ler ve API denetleyicileri

Yeni sorun ayrıntıları hizmeti

Sorun ayrıntıları hizmeti, HTTP API'leri IProblemDetailsServiceiçin Sorun Ayrıntıları oluşturmayı destekleyen arabirimini uygular.

Daha fazla bilgi için bkz . Sorun ayrıntıları hizmeti.

Yol grupları

Uzantı yöntemi, MapGroup ortak bir ön eke sahip uç nokta gruplarını düzenlemeye yardımcı olur. Yinelenen kodu azaltır ve uç nokta meta verilerini ekleyen ve WithMetadata gibi RequireAuthorization yöntemlere tek bir çağrıyla tüm uç nokta gruplarını özelleştirmeye olanak tanır.

Örneğin, aşağıdaki kod iki benzer uç nokta grubu oluşturur:

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;
}

Bu senaryoda, sonuçta üst bilgi 201 Created için Location göreli bir adres kullanabilirsiniz:

public static async Task<Created<Todo>> CreateTodo(Todo todo, TodoDb database)
{
    await database.AddAsync(todo);
    await database.SaveChangesAsync();

    return TypedResults.Created($"{todo.Id}", todo);
}

İlk uç nokta grubu yalnızca ön ekli /public/todos isteklerle eşleşir ve kimlik doğrulaması olmadan erişilebilir. İkinci uç nokta grubu yalnızca ön ekli isteklerle /private/todos eşleşir ve kimlik doğrulaması gerektirir.

QueryPrivateTodos Uç nokta filtresi fabrikası, özel todo verilerine erişmeye ve bunları depolamaya izin vermek için yol işleyicisinin TodoDb parametrelerini değiştiren yerel bir işlevdir.

Yol grupları, yol parametreleri ve kısıtlamalarıyla iç içe grupları ve karmaşık ön ek desenlerini de destekler. Aşağıdaki örnekte, gruba eşlenen user ve yol işleyicisi dış grup ön eklerinde tanımlanan ve {group} yol parametrelerini yakalayabilir{org}.

Ön ek de boş olabilir. Bu, yol desenini değiştirmeden bir uç nokta grubuna uç nokta meta verileri veya filtreleri eklemek için yararlı olabilir.

var all = app.MapGroup("").WithOpenApi();
var org = all.MapGroup("{org}");
var user = org.MapGroup("{user}");
user.MapGet("", (string org, string user) => $"{org}/{user}");

Bir gruba filtre veya meta veri eklemek, bir iç gruba veya belirli bir uç noktaya eklenmiş olabilecek ek filtreler veya meta veriler eklemeden önce bunları her uç noktaya tek tek eklemekle aynı şekilde davranır.

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);
});

Yukarıdaki örnekte dış filtre, ikinci kez eklenmiş olsa bile gelen isteği iç filtreden önce günlüğe kaydeder. Filtreler farklı gruplara uygulandığından, birbirlerine göre eklendikleri sıra önemli değildir. Sipariş filtrelerinin eklenmesi, aynı gruba veya belirli bir uç noktaya uygulandığında önemlidir.

için bir istek /outer/inner/ aşağıdakileri günlüğe kaydeder:

/outer group filter
/inner group filter
MapGet filter

gRPC

JSON kod dönüştürme

gRPC ON kodlama, gRPC JShizmetleri için ful JSON API'leri oluşturan RESTASP.NET Core uzantısıdır. gRPC JSON kodlama şunları sağlar:

  • Tanıdık HTTP kavramlarıyla gRPC hizmetlerini çağırmaya yönelik uygulamalar.
  • İşlevleri çoğaltmadan hem gRPC hem de ful JSON API'lerini desteklemek için Core gRPC RESTuygulamalarını ASP.NET.
  • Swashbuckle ile tümleştirerek, kodlanmış RESTgerçek api'lerden OpenAPI oluşturmak için deneysel destek.

Daha fazla bilgi için bkz. ASP.NET Core gRPC uygulamalarında gRPC JSON transcoding ve OpenAPI ile gRPC JSON transcoding ASP.NET Core uygulamaları kullanma.

ASP.NET Core'da gRPC sistem durumu denetimleri

gRPC sistem durumu denetimi protokolü, gRPC sunucu uygulamalarının sistem durumunu raporlamaya yönelik bir standarttır. Bir uygulama, sistem durumu denetimlerini gRPC hizmeti olarak kullanıma sunar. Bunlar genellikle bir uygulamanın durumunu denetlemek için bir dış izleme hizmetiyle birlikte kullanılır.

gRPC ASP.NET Core, paketle Grpc.AspNetCore.HealthChecks gRPC sistem durumu denetimleri için yerleşik destek ekledi. .NET sistem durumu denetimlerinin sonuçları arayanlara bildirilir.

Daha fazla bilgi için bkz . ASP.NET Core'da gRPC sistem durumu denetimleri.

Geliştirilmiş arama kimlik bilgileri desteği

Çağrı kimlik bilgileri, gRPC istemcisini sunucuya kimlik doğrulama belirteci gönderecek şekilde yapılandırmanın önerilen yoludur. gRPC istemcileri, çağrı kimlik bilgilerinin kullanımını kolaylaştırmak için iki yeni özelliği destekler:

  • Düz metin bağlantılarıyla arama kimlik bilgileri desteği. Daha önce bir gRPC çağrısı yalnızca bağlantıNıN TLS ile güvenli hale getirilmesi durumunda arama kimlik bilgilerini gönderiyordu. üzerinde GrpcChannelOptionsadlı UnsafeUseInsecureChannelCallCredentialsyeni bir ayar, bu davranışın özelleştirilmesine izin verir. TLS ile bağlantının güvenliğini sağlamamaya yönelik güvenlik etkileri vardır.
  • adlı AddCallCredentials yeni bir yöntem gRPC istemci fabrikası ile kullanılabilir. AddCallCredentials bir gRPC istemcisi için çağrı kimlik bilgilerini yapılandırmanın hızlı bir yoludur ve bağımlılık ekleme (DI) ile iyi tümleşir.

Aşağıdaki kod gRPC istemci fabrikasını meta verileri gönderecek Authorization şekilde yapılandırıyor:

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;
    });

Daha fazla bilgi için bkz . gRPC istemci fabrikasıyla taşıyıcı belirteci yapılandırma.

SignalR

İstemci sonuçları

Sunucu artık bir istemciden sonuç istemeyi destekliyor. Bunun için sunucunun kullanması ISingleClientProxy.InvokeAsync ve istemcinin işleyicisinden bir sonuç döndürmesi .On gerekir. Kesin türe sahip hub'lar da arabirim yöntemlerinden değer döndürebilir.

Daha fazla bilgi için bkz. İstemci sonuçları

Hub yöntemleri için SignalR bağımlılık ekleme

SignalR hub yöntemleri artık bağımlılık ekleme (DI) aracılığıyla hizmet eklemeyi destekliyor.

Hub oluşturucuları, DI'den gelen hizmetleri parametre olarak kabul edebilir ve bu hizmetler bir hub yönteminde kullanılmak üzere sınıfındaki özelliklerde depolanabilir. Daha fazla bilgi için bkz . Hub'a hizmet ekleme

Blazor

Konum değiştirme olaylarını ve gezinti durumunu işleme

.NET 7'de konum Blazor değiştirme olaylarını ve gezinti durumunu korumayı destekler. Bu, kullanıcıları kaydedilmemiş çalışma hakkında uyarmanıza veya kullanıcı sayfa gezintisi gerçekleştirdiğinde ilgili eylemleri gerçekleştirmenize olanak tanır.

Daha fazla bilgi için Yönlendirme ve gezinti makalesinin aşağıdaki bölümlerine bakın:

Boş Blazor proje şablonları

Blazor boş bir sayfaya başlamak için iki yeni proje şablonuna sahiptir. Yeni Blazor Server Boş Uygulama ve Blazor WebAssembly Uygulama Boş proje şablonları, aynı boş olmayan karşılıklarına benzer ancak örnek kod içermeyen şablonlardır. Bu boş şablonlar yalnızca temel bir giriş sayfası içerir ve farklı bir CSS çerçevesiyle başlayabilmeniz için Bootstrap'ı kaldırdık.

Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Blazor özel öğeleri

paket, Microsoft.AspNetCore.Components.CustomElements kullanarak Blazorstandart tabanlı özel DOM öğeleri oluşturmanızı sağlar.

Daha fazla bilgi için bkz . ASP.NET Çekirdek Razor bileşenleri.

Bağlama değiştiricileri (@bind:after, @bind:get, @bind:set)

Önemli

Özellikler @bind:after//@bind:get@bind:set şu anda daha fazla güncelleştirme alıyor. En son güncelleştirmelerden yararlanmak için en son SDK'yı yüklediğinizi onaylayın.

Olay geri çağırma parametresi ([Parameter] public EventCallback<string> ValueChanged { get; set; }) kullanılması desteklenmez. Bunun yerine , öğesine bir -returning veya -returning yöntemi @bind:set/@bind:aftergeçirinAction.Task

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

.NET 7'de, yeni @bind:after değiştiriciyi kullanarak bir bağlama olayı tamamlandıktan sonra zaman uyumsuz mantık çalıştırabilirsiniz. Aşağıdaki örnekte, arama metninde PerformSearch yapılan değişiklikler algılandıktan sonra zaman uyumsuz yöntem otomatik olarak çalıştırılır:

<input @bind="searchText" @bind:after="PerformSearch" />

@code {
    private string searchText;

    private async Task PerformSearch()
    {
        ...
    }
}

.NET 7'de, bileşen parametreleri için bağlamayı ayarlamak da daha kolaydır. Bileşenler, bir parametre çifti tanımlayarak iki yönlü veri bağlamayı destekleyebilir:

  • @bind:get: Bağlanacak değeri belirtir.
  • @bind:set: Değer değiştiğinde için bir geri çağırma belirtir.

@bind:get ve @bind:set değiştiricileri her zaman birlikte kullanılır.

Örnekler:

@* 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; }
}

Bileşen hakkında InputText daha fazla bilgi için bkz . ASP.NET Core Blazor giriş bileşenleri.

Çalışırken Yeniden Yükleme geliştirmeleri

.NET 7'de Çalışırken Yeniden Yükleme desteği aşağıdakileri içerir:

  • Bileşenler, bir değer kaldırıldığında parametrelerini varsayılan değerlerine sıfırlar.
  • Blazor WebAssembly:
    • Yeni türler ekleyin.
    • İç içe sınıflar ekleyin.
    • Mevcut türlere statik ve örnek yöntemleri ekleyin.
    • Mevcut türlere statik alanlar ve yöntemler ekleyin.
    • Mevcut yöntemlere statik lambdalar ekleyin.
    • Önceden yakalanan mevcut yöntemlere yakalayan this this lambdalar ekleyin.

içinde MSAL ile dinamik kimlik doğrulama istekleri Blazor WebAssembly

.NET 7'deki yeni sürümler, Blazor WebAssembly gelişmiş kimlik doğrulama senaryolarını işlemek için özel parametrelerle çalışma zamanında dinamik kimlik doğrulama istekleri oluşturmayı destekler.

Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Blazor WebAssembly hata ayıklama geliştirmeleri

Blazor WebAssembly hata ayıklama aşağıdaki geliştirmeleri içerir:

  • Kullanıcı kodundan olmayan tür üyelerini göstermek veya gizlemek için Yalnızca Benim Kodum ayarı için destek.
  • Çok boyutlu dizileri inceleme desteği.
  • Çağrı Yığını artık zaman uyumsuz yöntemler için doğru adı gösteriyor.
  • geliştirilmiş ifade değerlendirmesi.
  • Türetilmiş üyelerde anahtar sözcüğün new doğru işlenmesi.
  • içinde System.Diagnosticshata ayıklayıcıyla ilgili öznitelikler için destek.

System.Security.Cryptography WebAssembly'de destek

.NET 6, WebAssembly üzerinde çalışırken SHA karma algoritmaları ailesini desteklemektedir. .NET 7, mümkün olduğunda 'den SubtleCryptoyararlanarak ve kullanılamadığında SubtleCrypto .NET uygulamasına geri dönerek daha fazla şifreleme algoritması sağlar. .NET 7'de WebAssembly'de aşağıdaki algoritmalar desteklenir:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • HMACSHA1
  • HMACSHA256
  • HMACSHA384
  • HMACSHA512
  • AES-CBC
  • PBKDF2
  • HKDF

Daha fazla bilgi için bkz . Browser-wasm'i hedefleyen geliştiriciler Web Şifreleme API'lerini (dotnet/runtime #40074) kullanabilir.

Özel doğrulama özniteliklerine hizmet ekleme

Artık hizmetleri özel doğrulama özniteliklerine ekleyebilirsiniz. Blazor , hizmet sağlayıcısı olarak kullanılabilmesi için öğesini ayarlar ValidationContext .

Daha fazla bilgi için bkz . ASP.NET Core Blazor form doğrulaması.

Input* dışındaki bileşenler EditContext/EditForm

Yerleşik giriş bileşenleri artık bileşen işaretlemesindeki Razor bir formun dışında destekleniyor.

Daha fazla bilgi için bkz . ASP.NET Core Blazor giriş bileşenleri.

Proje şablonu değişiklikleri

.NET 6 geçen yıl yayımlandığında, sayfanın (Pages/_Host.chstml) HTML işaretlemesi _Host sayfa ile .NET 6 Blazor Server proje şablonundaki yeni _Layout bir sayfa (Pages/_Layout.chstml) arasında _Host bölündü.

.NET 7'de, HTML işaretlemesi proje şablonlarındaki _Host sayfayla yeniden birleştirilmiş.

Proje şablonlarında Blazor birkaç ek değişiklik yapıldı. Belgelerde şablonlara yapılan her değişikliği listelemek mümkün değildir. Tüm değişiklikleri benimsemek için bir uygulamayı .NET 7'ye geçirmek için bkz . ASP.NET Core 6.0'dan 7.0'a geçiş.

Deneysel QuickGrid bileşen

QuickGrid Yeni bileşen, en yaygın gereksinimler için ve veri kılavuzu bileşenleri oluşturan Blazor herkes için başvuru mimarisi ve performans temeli olarak kullanışlı bir veri kılavuzu bileşeni sağlar.

Daha fazla bilgi için bkz . ASP.NET Core Blazor QuickGrid bileşeni.

Canlı tanıtım: Örnek uygulama için Blazor QuickGrid

Sanallaştırma geliştirmeleri

.NET 7'de sanallaştırma geliştirmeleri:

  • Bileşen Virtualize , başka bir öğenin overflow-y: scroll uygulanmasına alternatif olarak belgenin kendisini kaydırma kökü olarak kullanmayı destekler.
  • Virtualize Bileşen belirli bir alt etiket adı gerektiren bir öğenin içine yerleştirilirse, SpacerElement sanallaştırma ara çubuğu etiket adını almanıza veya ayarlamanıza olanak tanır.

Daha fazla bilgi için Sanallaştırma makalesinin aşağıdaki bölümlerine bakın:

MouseEventArgs Güncelleştirme

MovementX ve MovementY öğesine MouseEventArgseklendi.

Daha fazla bilgi için bkz . ASP.NET Core Blazor olay işleme.

Yeni Blazor yükleme sayfası

Proje şablonu, Blazor WebAssembly uygulamayı yükleme işleminin ilerleme durumunu gösteren yeni bir yükleme kullanıcı arabirimine sahiptir.

Daha fazla bilgi için bkz . ASP.NET Core Blazor başlatma.

uygulamasında kimlik doğrulaması için geliştirilmiş tanılama Blazor WebAssembly

Uygulamalarda kimlik doğrulaması sorunlarını tanılamaya Blazor WebAssembly yardımcı olmak için ayrıntılı günlük kaydı sağlanır.

Daha fazla bilgi için bkz . ASP.NET Çekirdek Blazor günlüğü.

WebAssembly'de JavaScript birlikte çalışma

JavaScript birlikte çalışma API'si [JSImport]/[JSExport] , .NET'i Blazor WebAssembly içinde ve JavaScript tabanlı uygulamalarda kullanmaya yönelik yeni bir alt düzey mekanizmadır. Bu yeni JavaScript birlikte çalışma zamanı özelliğiyle, .NET WebAssembly çalışma zamanını kullanarak JavaScript'ten .NET kodunu çağırabilir ve UI bileşen modeline bağımlılık Blazor olmadan .NET'ten JavaScript işlevselliğine çağrı yapabilirsiniz.

Daha fazla bilgi için:

Kimlik doğrulama durumu sağlayıcısının koşullu kaydı

.NET 7'nin yayımlanmasından önce, AuthenticationStateProvider ile AddScopedhizmet kapsayıcısına kaydedilmişti. Bu, özel bir uygulama sağlarken belirli bir hizmet kaydı sırasını zorladığı için uygulamalarda hata ayıklamayı zorlaştırdı. Zaman içindeki iç çerçeve değişiklikleri nedeniyle, ile kaydolmak AuthenticationStateProvider AddScopedartık gerekli değildir.

Geliştirici kodunda, kimlik doğrulama durumu sağlayıcısı hizmet kaydında aşağıdaki değişikliği yapın:

- builder.Services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
+ builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

Yukarıdaki örnekte geliştiricinin ExternalAuthStateProvider hizmet uygulaması verilmiştir.

.NET WebAssembly derleme araçlarında geliştirmeler

.NET 7 için iş yükünde wasm-tools performansı geliştirmeye ve özel durumları işlemeye yardımcı olan yeni özellikler:

Daha fazla bilgi için bkz . ASP.NET Core Blazor WebAssembly derleme araçları ve önceden (AOT) derleme.

Blazor Hybrid

Dış URL'ler

Dış web sayfalarının tarayıcıda açılmasına izin veren bir seçenek eklendi.

Daha fazla bilgi için bkz . ASP.NET Temel Blazor Hybrid yönlendirme ve gezinti.

Güvenlik

Güvenlik senaryoları için Blazor Hybrid yeni yönergeler sağlanır. Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Performans

Çıkış önbelleğe alma ara yazılımı

Çıktı önbelleğe alma, bir web uygulamasından gelen yanıtları depolayan ve bunları her seferinde bilgi işlemden ziyade önbellekten sunan yeni bir ara yazılımdır. Çıktı önbelleğe alma, yanıt önbelleğe almadan aşağıdaki yollarla farklıdır:

  • Önbelleğe alma davranışı sunucuda yapılandırılabilir.
  • Önbellek girdileri program aracılığıyla geçersiz kılınabilir.
  • Kaynak kilitleme, önbellek damgalama ve sürüde gök gürültüsü oluşturma riskini azaltır.
  • Önbellek yeniden doğrulama, sunucunun önbelleğe alınmış yanıt gövdesi yerine http 304 Not Modified durum kodu döndürebileceği anlamına gelir.
  • Önbellek depolama ortamı genişletilebilir.

Daha fazla bilgi için bkz . Önbelleğe alma ve Çıktı önbelleğe alma ara yazılımına genel bakış.

HTTP/3 geliştirmeleri

Bu sürüm:

  • HTTP/3'ün ASP.NET Core tarafından tamamen desteklenmesine neden olur, artık deneysel değildir.
  • Kestrel'nin HTTP/3 desteğini geliştirir. geliştirmenin iki ana alanı, HTTP/1.1 ve HTTP/2 ile özellik eşliği ve performanstır.
  • HTTP/3 ile için UseHttps(ListenOptions, X509Certificate2) tam destek sağlar. KestrelBağlantı sertifikalarını yapılandırmak için Sunucu Adı Göstergesi'ne (SNI) bağlanma gibi gelişmiş seçenekler sunar.
  • HTTP.sys ve IIS'de HTTP/3 desteği ekler.

Aşağıdaki örnekte TLS seçeneklerini çözmek için SNI geri çağırmanın nasıl kullanılacağı gösterilmektedir:

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);
            },
        });
    });
});

HTTP/3 ayırmalarını azaltmak için .NET 7'de önemli çalışmalar yapıldı. Bu iyileştirmelerden bazılarını aşağıdaki GitHub pr'lerinde görebilirsiniz:

HTTP/2 Performans geliştirmeleri

.NET 7, HTTP/2 isteklerini nasıl Kestrel işlediğine ilişkin önemli bir yeniden mimari sağlar. http/2 bağlantıları yoğun olan ASP.NET Core uygulamaları daha az CPU kullanımı ve daha yüksek aktarım hızıyla karşılaşır.

Daha önce HTTP/2 çoğullama uygulaması, hangi isteğin temel TCP bağlantısına yazabileceğini denetleyen bir kilit kullanırdı. yazma kilidinin yerini iş parçacığı güvenli bir kuyruk alır. Şimdi, yazma kilidini hangi iş parçacığının kullanabileceğiyle mücadele etmek yerine istekler artık sıraya alınıyor ve ayrılmış bir tüketici bunları işliyor. Daha önce boşa harcanan CPU kaynakları uygulamanın geri kalanında kullanılabilir.

Bu iyileştirmelerin fark edilebileceği bir yer, HTTP/2 kullanan popüler bir RPC çerçevesi olan gRPC'dir. Kestrel + gRPC karşılaştırmaları önemli bir gelişme gösteriyor:

gRPC sunucusu akış performansı

HTTP/2 çerçeve yazma kodunda, tek bir HTTP/2 bağlantısında veri yazmaya çalışan birden çok akış olduğunda performansı geliştiren değişiklikler yapıldı. Artık TLS çalışmalarını iş parçacığı havuzuna gönderiyoruz ve diğer akışların verilerini yazmak için edinebileceği bir yazma kilidini daha hızlı bir şekilde serbest bırakıyoruz. Bekleme sürelerindeki azalma, bu yazma kilidi için çekişme olduğu durumlarda önemli performans geliştirmeleri sağlayabilir. Tek bir bağlantıda (TLS ile) 70 akışa sahip bir gRPC karşılaştırması, bu değişiklikle saniye başına isteklerde (RPS) yaklaşık %15'lik bir gelişme gösterdi.

Http/2 WebSockets desteği

.NET 7, SignalR ile, Blazor WebAssemblyJavaScript istemcisi ve SignalR için KestrelHTTP/2 desteği üzerinden Websockets'i tanıtır.

HTTP/2 üzerinden WebSockets kullanmak aşağıdaki gibi yeni özelliklerden yararlanır:

  • Üst bilgi sıkıştırma.
  • Sunucuya birden çok istekte bulunurken gereken süreyi ve kaynakları azaltan çoğullama.

Bu desteklenen özellikler tüm HTTP/2 özellikli platformlarda Kestrel kullanılabilir. Sürüm anlaşması tarayıcılarda ve Kestrel'de otomatiktir, bu nedenle yeni API'ler gerekmez.

Daha fazla bilgi için bkz . Http/2 WebSockets desteği.

Kestrel yüksek çekirdek makinelerde performans iyileştirmeleri

Kestrel birçok amaçla kullanılır ConcurrentQueue<T> . Bir amaç, G/Ç işlemlerini 'nin varsayılan Yuva taşımasında Kestrelzamanlamaktır. ile ilişkili yuvaya göre bölümleme ConcurrentQueue çekişmesini azaltır ve birçok CPU çekirdeğine sahip makinelerde aktarım hızını artırır.

.NET 6'daki yüksek çekirdek makinelerde profil oluşturma işlemi, PinnedMemoryPool Kestrel bayt arabelleklerini önbelleğe almak için kullanılan diğer ConcurrentQueue örneklerden birinde Kestrelönemli bir çekişme gösterdi.

.NET 7'de bellek havuzu G Kestrel/Ç kuyruğuyla aynı şekilde bölümlenmiştir ve bu da yüksek çekirdek makinelerde çok daha düşük çekişmeye ve daha yüksek aktarım hızına yol açar. 80 çekirdekli ARM64 VM'lerinde TechEmpower düz metin karşılaştırmasında saniye başına yanıtlarda (RPS) %500'den fazla gelişme görüyoruz. 48 Çekirdekli AMD VM'lerinde, HTTPS JSON karşılaştırmamızda iyileştirme neredeyse %100'dür.

ServerReady başlangıç zamanını ölçmek için olay

EventSource kullanan uygulamalar, başlangıç performansını anlamak ve iyileştirmek için başlangıç süresini ölçebilir. içindeki Microsoft.AspNetCore.Hosting yeni ServerReady olay, sunucunun isteklere yanıt vermeye hazır olduğu noktayı temsil eder.

Sunucu

Başlangıç zamanını ölçmek için yeni ServerReady olayı

Olay, ServerReady ASP.NET Core uygulamalarının başlangıç süresini ölçmek için eklenmiştir.

IIS

IIS'de gölge kopyalama

IIS için ASP.NET Çekirdek Modülü'ne (ANCM) gölge kopyalama uygulaması derlemeleri, uygulamayı çevrimdışı dosya dağıtarak durdurmaktan daha iyi bir son kullanıcı deneyimi sağlayabilir.

Daha fazla bilgi için bkz . IIS'de gölge kopyalama.

Çeşitli

Kestrel tam sertifika zinciri geliştirmeleri

HttpsConnectionAdapterOptions, X509Certificate2Collection türünde yeni bir ServerCertificateChain özelliğine sahiptir. Bu özellik, ara sertifikaları içeren tam bir zincir belirtilmesine izin vererek sertifika zincirlerini doğrulamayı kolaylaştırır. Diğer ayrıntılar için bkz . dotnet/aspnetcore#21513 .

dotnet watch

dotnet watch için geliştirilmiş konsol çıkışı

dotnet watch'un konsol çıkışı, ASP.NET Core'un günlüğe kaydedilmesine daha iyi uyum sağlamak ve emojilerle 😮😍öne çıkmak için geliştirilmiştir.

İşte yeni çıkışın nasıl göründüğüne ilişkin bir örnek:

dotnet watch için çıkış

Daha fazla bilgi için bu GitHub çekme isteğine bakın.

Dotnet watch'ı kaba düzenlemeler için her zaman yeniden başlatacak şekilde yapılandırma

Kaba düzenlemeler, sık erişimli yeniden yüklenebilen düzenlemelerdir. Dotnet watch'u kaba düzenlemeler istenmeden her zaman yeniden başlatacak şekilde yapılandırmak için ortam değişkenini DOTNET_WATCH_RESTART_ON_RUDE_EDIT olarak trueayarlayın.

Geliştirici özel durum sayfası koyu mod

Patrick Westerhof'un katkıları sayesinde geliştirici özel durum sayfasına koyu mod desteği eklendi. Tarayıcıda koyu modu test etmek için geliştirici araçları sayfasında modu koyu olarak ayarlayın. Örneğin, Firefox'ta:

F12 araçları FF koyu modu

Chrome'da:

F12 araçları Chrome koyu modu

Üst düzey deyimler yerine Program.Main yöntemini kullanmak için proje şablonu seçeneği

.NET 7 şablonları, üst düzey deyimleri kullanmama ve bir sınıfta bildirilen Program bir namespace ve Main yöntemi oluşturma seçeneği içerir.

.NET CLI'yı kullanarak şu --use-program-main seçeneği kullanın:

dotnet new web --use-program-main

Visual Studio ile proje oluşturma sırasında yeni Üst düzey deyimleri kullanma onay kutusunu seçin:

onay kutusu

Güncelleştirilmiş Angular ve React şablonları

Angular proje şablonu Angular 14 olarak güncelleştirildi. React proje şablonu React 18.2 olarak güncelleştirildi.

dotnet user-jwts ile geliştirme aşamasında on Web Belirteçlerini yönetme JS

Yeni dotnet user-jwts komut satırı aracı, uygulamaya özgü yerel JSON Web Belirteçleri (JWT) oluşturabilir ve yönetebilir. Daha fazla bilgi için bkz. Dotnet user-jwts ile geliştirme aşamasındaki ON Web Belirteçlerini YönetmeJS.

W3CLogger'da ek istek üst bilgileri desteği

Artık üzerinde arayarak AdditionalRequestHeaders() W3CLoggerOptionsW3C günlükçü kullanırken günlüğe kaydedilecek ek istek üst bilgileri belirtebilirsiniz:

services.AddW3CLogging(logging =>
{
    logging.AdditionalRequestHeaders.Add("x-forwarded-for");
    logging.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
});

Daha fazla bilgi için bkz . W3CLogger seçenekleri.

Sıkıştırmayı açma isteği

Yeni İstek sıkıştırması açma ara yazılımı:

  • API uç noktalarının sıkıştırılmış içeriğe sahip istekleri kabul etmelerini sağlar.
  • Content-Encoding Sıkıştırılmış içerik içeren istekleri otomatik olarak tanımlamak ve sıkıştırmasını açmak için HTTP üst bilgisini kullanır.
  • Sıkıştırılmış istekleri işlemek için kod yazma gereksinimini ortadan kaldırır.

Daha fazla bilgi için bkz . Sıkıştırmayı kaldırma ara yazılımı isteme.