Откройте для себя новые возможности ASP.NET Core в .NET 7!

Не новость, что компания Microsoft очень усердно работает над улучшением и привнесением новых функций в фреймворк .NET или в язык программирования C#. На этот раз Microsoft нацелилась на веб-разработку и сосредоточилась на ASP.NET Core, который, очевидно, будет поставляться вместе с версией .NET 7.

Некоторое время назад Microsoft выпустила Preview 1 ASP.NET Core на .NET 7, и количество новых функций велико, так что давайте посмотрим на новые возможности!


Новые минимальные улучшения API

Первая из новых возможностей принесет улучшения в минимальных API, особенно в IFormFile и IFormCollection. Благодаря новым улучшениям вы сможете использовать IFormFile и IFormCollection для обработки и управления загрузкой файлов гораздо проще.

Microsoft предупреждает, что если вы хотите использовать эти новые функции с аутентификацией, необходима защита от подделки, но пока Microsoft не реализовала такую поддержку. Однако они заверяют нас, что она есть в дорожной карте .NET 7.

Поддержка таких запросов с клиентскими сертификатами или заголовками cookie в настоящее время не работает. Давайте рассмотрим пример, предоставленный Microsoft, чтобы увидеть эту новую функцию ASP.NET Core в действии:

app.MapPost("/upload", async(IFormFile file) =>
{
    using var stream = System.IO.File.OpenWrite("upload.txt");
    await file.CopyToAsync(stream); 
});

app.MapPost("/upload", async (IFormFileCollection myFiles) => { ... });
Вход в полноэкранный режим Выход из полноэкранного режима

И это еще не все, у нас есть еще много улучшений минимального API.

Следующее новое улучшение для минимальных API в ASP.NET Core предназначено для Steam и PipeRider.

Чтобы понять, в каком сценарии будут использоваться эти новые минимальные API, давайте представим, что нам нужно хранить данные в хранилище blob или ставить их в очередь в каком-нибудь провайдере очередей, например, Azure. В этом случае мы можем использовать Steam и PipeRider для связывания тела запроса и последующей его обработки в облаке. Давайте рассмотрим пример Microsoft:

app.MapPost("v1/feeds", async (QueueClient queueClient, Stream body, CancellationToken cancellationToken) =>
{
    await queueClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
    await queueClient.SendMessageAsync(await BinaryData.FromStreamAsync(body), cancellationToken: cancellationToken);
});
Вход в полноэкранный режим Выход из полноэкранного режима

Однако Microsoft предупреждает нас о трех деталях, необходимых для правильного функционирования этих минимальных API:

  • Stream всегда будет тем же объектом, что и HttpRequest.Body при получении любого типа данных.
  • Stream не может быть прочитан более одного раза (не перематывается), так как по умолчанию тело запроса не хранится в буфере.
  • Поскольку базовые буферы в конечном итоге будут повторно использоваться и отбрасываться, как Stream, так и PipeRider не могут быть использованы вне обработчика действия.

Последнее улучшение в минимальных API, которое Microsoft привносит в Preview 1, касается конфигурации JSON. С помощью ConfigureRouteHandlerJsonOptions мы сможем вручную настраивать параметры и настройки конечных точек минимального API, используя JSON.

Это улучшение было введено в основном, как говорит Microsoft, чтобы избежать путаницы с Microsoft.AspNetCore.Mvc.JsonOptions. Давайте посмотрим пример, предоставленный Microsoft:

var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureRouteHandlerJsonOptions(options =>
{
    //Ignore Cycles
    options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; 
});
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы хотите узнать больше об этой функции, я рекомендую вам, как всегда, обратиться к первоисточнику: Минимальные улучшения API


Новый генератор клиентских источников для SignalR

Это следующая новая возможность, которую ASP.NET Core принесет в .NET 7. Этот новый генератор исходного кода для SignalR, представленный Microsoft, имеет возможность генерировать код (как отправляющий, так и принимающий), сильно типизированный на основе определенных разработчиком интерфейсов.

Это особенно относится к интерфейсам концентратора SignalR, нет необходимости использовать их в слабо типизированных методах, теперь у нас есть возможность повторно использовать их в клиенте. В то же время существует возможность реализации интерфейса, содержащего методы, и в то же время клиент может воспользоваться этим интерфейсом для вызова любого метода, являющегося частью концентратора.

Хорошо то, что Microsoft позволила нам увидеть использование и работу этого нового генератора SignalR. Давайте посмотрим, как Microsoft использует его:

  • Сначала нужно добавить ссылку на Microsoft.AspNetCore.SignalR.Client.SourceGenerator .
  • Затем в проект необходимо добавить следующие классы: HubClientProxyAttribute и HubServerProxyAttribute :
[AttributeUsage(AttributeTargets.Method)]
internal class HubServerProxyAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Method)]
internal class HubClientProxyAttribute : Attribute
{
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Следующим шагом будет добавление статического частичного класса и запись следующих статических частичных методов вместе с атрибутами HubServerProxy и HubClientProxy таким образом:
internal static partial class MyCustomExtensions
{
    [HubClientProxy]
    public static partial IDisposable ClientRegistration<T>(this HubConnection connection, T provider);

    [HubServerProxy]
    public static partial T ServerProxy<T>(this HubConnection connection);
}
Войти в полноэкранный режим Выйти из полноэкранного режима
  • И, наконец, мы будем использовать частичные методы и все:
public interface IServerHub
{
    Task SendMessage(string message);
    Task<int> Echo(int i);
}

public interface IClient
{
    Task ReceiveMessage(string message);
}

public class Client : IClient
{
    // Equivalent to HubConnection.On("ReceiveMessage", (message) => {});
    Task ReceiveMessage(string message)
    {
        return Task.CompletedTask;
    }
}

HubConnection connection = new HubConnectionBuilder().WithUrl("...").Build();
var stronglyTypedConnection = connection.ServerProxy<IServerHub>();
var registrations = connection.ClientRegistration<IClient>(new Client());

await stronglyTypedConnection.SendMessage("Hello world");
var echo = await stronglyTypedConnection.Echo(10);
Вход в полноэкранный режим Выход из полноэкранного режима

Вот и все, вот как просто использовать новый генератор исходников клиента SignalR.

Если вы хотите узнать больше об этой функции, я рекомендую вам, как всегда, обратиться к первоисточнику: Генератор клиентских источников SignalR


Razor Pages и представления MVC с нулевыми моделями

Мы продолжаем работу над очередным усовершенствованием, предложенным компанией Microsoft. На этот раз они сосредоточились на улучшении пользовательского опыта работы с проверками и для этого реализовали представление nullable для проверок, сделанных из null-состояния любого приложения ASP.NET Core. В данном случае это пример, который предоставляет нам Microsoft:

@model Product?
Вход в полноэкранный режим Выход из полноэкранного режима

К сожалению, других примеров или вариантов использования этой новой функции нет. Остается надеяться, что Microsoft продолжит выпускать новые функции и больше рассказывать об уже представленных.


Валидация ошибок с помощью имен свойств JSON

Благодаря этой новой возможности ASP.NET мы сможем вручную настроить с помощью «SystemTextJsonValidationMetadataProvider» валидацию с использованием имен свойств JSON.

Ранее, поскольку имена свойств, которые имеет модель, обычно были деталями реализации, управлять ими из одностраничного приложения было сложно. Давайте проверим на следующем примере реализацию этой новой возможности:

services.AddControllers(options =>
{
    options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider())
});
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы хотите узнать больше об этой возможности, я рекомендую вам, как всегда, обратиться к первоисточнику: Использование имен свойств JSON в ошибках валидации


Новый вывод консоли dotnet watch

Давайте перейдем к моей любимой функции, теперь Microsoft поработала над тем, чтобы добиться гораздо более чистого консольного вывода dotnet watch, улучшив выход из системы и добавив несколько эмодзи.

Лично мне нечего добавить к этой функции, просто посмотрите на пример Microsoft:

C:BlazorApp> dotnet watch
dotnet watch 🔥 Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
  💡 Press "Ctrl + R" to restart.
dotnet watch 🔧 Building...
  Determining projects to restore...
  All projects are up-to-date for restore.
  You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy
  BlazorApp -> C:UsersdarothDesktopBlazorAppbinDebugnet7.0BlazorApp.dll
dotnet watch 🚀 Started
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7148
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5041
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:UsersdarothDesktopBlazorApp
dotnet watch ⌚ File changed: .PagesIndex.razor.
dotnet watch 🔥 Hot reload of changes succeeded.
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...
dotnet watch 🛑 Shutdown requested. Press Ctrl+C again to force exit.
Вход в полноэкранный режим Выход из полноэкранного режима

Мне нравится то, что я вижу, а вам нравится?

Если вы хотите узнать больше об этой функции, я рекомендую вам, как всегда, обратиться к первоисточнику: Улучшенный вывод консоли для dotnet watch.


Инъекция сервисов в Blazor

Инжекция сервисов в атрибуты Blazor? Да, благодаря этому улучшению вы сможете инжектировать практически любой тип сервиса в пользовательские атрибуты валидации. Для этого ValidationContext будет настроен Blazor на использование в качестве поставщика услуг. Рассмотрим следующий пример Microsoft:

public class SaladChefValidatorAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var saladChef = validationContext.GetRequiredService<SaladChef>();
        if (saladChef.ThingsYouCanPutInASalad.Contains(value.ToString()))
        {
            return ValidationResult.Success;
        }
        return new ValidationResult("You should not put that in a salad!");
    }
}

// Simple class configured as a service for dependency injection
public class SaladChef
{
    public string[] ThingsYouCanPutInASalad = { "Strawberries", "Pineapple", "Honeydew", "Watermelon", "Grapes" };
}
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы хотите узнать больше об этой функции, я рекомендую вам, как всегда, обратиться к первоисточнику: Вставка служб в пользовательские атрибуты валидации в Blazor

На данный момент мы все еще ждем новых новостей от Microsoft. Мы знаем только то, что в настоящее время она сосредоточена в основном на производительности, Blazor, Razor, HTTP/3, MVC и некоторых других вещах.

Что может принести нам Microsoft в ближайшие месяцы? Что удивит нас? Только Microsoft знает 🙂

Оцените статью
devanswers.ru
Добавить комментарий