Не новость, что компания 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 знает 🙂