.NET 7: Microsoft раскрывает новые возможности ASP.NET Core

Компания Microsoft раскрыла новые возможности, которые будут включены в следующую версию ASP.NET Core для .NET 7. Новая предварительная версия включает в себя усовершенствования API, настройку согласия на использование cookie, поддержку теневого копирования и многое другое. Давайте посмотрим, что нового в ASP.NET Core в .NET 7!

Инфертирование параметров действия контроллера API, передаваемых через сервис

Ранее необходимо было применять атрибут [FromServices] к параметрам. Теперь, благодаря этому обновлению, привязка параметров для действий контроллера API имеет возможность связывать их с помощью инъекций зависимостей.

Давайте рассмотрим пример Microsoft:

Services.AddScoped<SomeCustomType>();

[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    // Both actions will bound the SomeCustomType from the DI container
    public ActionResult GetWithAttribute([FromServices]SomeCustomType service) => Ok();
    public ActionResult Get(SomeCustomType service) => Ok();
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Но это не является обязательным. Помимо возможности связывать параметры с помощью инъекций, мы также можем просто отключить ее, если не хотим ее использовать. Для того чтобы отключить это, нам нужно просто использовать DisableImplicitFromServicesParameters.

Давайте снова рассмотрим пример, предоставленный компанией Microsoft:

Services.Configure<ApiBehaviorOptions>(options =>
{
     options.DisableImplicitFromServicesParameters = true;
})
Вход в полноэкранный режим Выход из полноэкранного режима

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

Инъекция зависимостей для методов концентратора SignalR

Если вы помните ASP.NET Core Preview 1 в .NET 7, вы вспомните, что в нем были добавлены улучшения SignalR. В последней предварительной версии был добавлен новый генератор клиентских источников для SignalR.

Теперь, в этой предварительной версии, используя Dependency Injection (DI), у нас есть возможность инжектировать службы с методами концентратора SignalR (спасибо Microsoft за добавление этой поддержки):

Services.AddScoped<SomeCustomType>();

public class MyHub : Hub
{
    // SomeCustomType comes from DI by default now
    public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Кроме того, мы можем явно отметить только один параметр. Это полезно для того, чтобы иметь возможность связать только этот параметр с настроенными службами. Для этого просто настройте атрибут [FromServices]:

public class MyHub : Hub
{
    public Task Method(string arguments, [FromServices] SomeCustomType type);
}
Войти в полноэкранный режим Выйти из полноэкранного режима

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

services.AddSignalR(options =>
{
    options.DisableImplicitFromServicesParameters = true;
});
Войти в полноэкранный режим Выход из полноэкранного режима

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

Минимальные резюме и описания конечных точек API

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

Давайте посмотрим, как Microsoft применяет ее в своем примере с методами расширения:

app.MapGet("/hello", () => ...)
  .WithDescription("Sends a request to the backend HelloService to process a greeting request.");
Вход в полноэкранный режим Выход из полноэкранного режима

Еще одна вещь, которую мы можем сделать, — это использовать атрибут делегата обработчика маршрута для установки резюме или описания. В соответствии с примером:

app.MapGet("/hello", [EndpointSummary("Sends a Hello request to the backend")]() => ...)
Вход в полноэкранный режим Выход из полноэкранного режима

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

Привязка заголовка HTTPS и значений строки запроса к массивам

Это следующая функция, представленная во втором предварительном обзоре от Microsoft. Эта функция позволяет нам привязывать строки запроса и значения заголовка HTTPS к StringValues или любому массиву примитивного типа.

Например, если мы хотим привязать к массиву строк:

// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (string[] names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы привязать значения строки запроса к массиву примитивного типа:

// GET  /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) => $"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}")
Войти в полноэкранный режим Выйти из полноэкранного режима

Для привязки к StringValues :

// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (StringValues names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
Войдите в полноэкранный режим Выйти из полноэкранного режима

Вы можете посмотреть эти примеры здесь: Привязка массивов и StringValues из заголовков и строк запроса в минимальных API

Настройка значения согласия на использование куки

Эта возможность была предоставлена Дэвидом Де Сметом. Эта возможность позволяет использовать свойство CookiePolicyOptions.ConsentCookieValue для добавления пользовательского значения для отслеживания (только если пользователь или посетитель принимает политику cookie).

На Github компании Dotnet приводится такой пример:

services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;
    options.ConsentCookieValue = "true";
});
Вход в полноэкранный режим Выход из полноэкранного режима

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

Теневое копирование для запроса IIS

Теневое копирование позволяет обновлять различные сборки приложения во время его работы. Когда приложение ASP.NET Core запущено в Windows, эти двоичные файлы блокируются, чтобы предотвратить любые изменения. Очевидно, что можно остановить приложение, развернув копию файла в автономном режиме, но в большинстве случаев это не идеально. Для этого функция теневого копирования может создать копию сборок, чтобы ее можно было обновить.

Чтобы включить эту функцию, по словам Microsoft, нужно просто изменить настройки обработчика ANCM в файле web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
      <handlerSettings>
        <handlerSetting name="experimentalEnableShadowCopy" value="true" />
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
      </handlerSettings>
    </aspNetCore>
  </system.webServer>
</configuration>
Войти в полноэкранный режим Выход из полноэкранного режима

Microsoft также добавляет:

«Мы рассматриваем возможность сделать теневое копирование в IIS функцией ASP.NET Core в .NET 7, и нам нужны дополнительные отзывы о том, удовлетворяет ли эта функция требованиям пользователей».

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

На данный момент мы продолжаем держать пальцы скрещенными, что Microsoft скоро выпустит свежие подробности. Что нового готовит нам Microsoft в ближайшие несколько недель или месяцев? Что застанет нас врасплох? Microsoft — единственный, кто знает.

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